优化选项
图片资源一般可做如下优化设置
- 打包图集
- mipmap不必要时选择关闭
- Read/Write Enabled不必要时关闭
- 纹理压缩
图集打包的可以参考Unity性能优化之图集打包;mipmap是多级渐变纹理,Unity会生成多张不同像素的纹理以优化性能,因此不必要时就不要设置mipmap防止增加内存;Read/Write Enabled开启时可能会存在内存拷贝以便io操作,因此尽量不要开启;纹理压缩比较复杂,下文讲解。
纹理压缩
资源优化一直是游戏性能优化的重要内容,对于贴图资源来说,除了打包图集以外,还可以根据游戏效果和需求对贴图进行压缩。
贴图压缩的好处有
- 减少包体大小
- 降低内存损耗,提高加载速度
Unity的贴图压缩方案
格式 | 平台 | 不支持机型 | 像素深度 | 尺寸要求 | 画质 | 备注 |
RGBA32 | Android/iOS | 无 | 32 | 无 | ★★★★★ | 极高的清晰度,原图不压缩 |
RGB24 | Android/iOS | 无 | 24 | 无 | ★★★★★ | 极高的清晰度,不支持透明通道 |
RGBA16 | Android/iOS | 无 | 16 | 无 | ★★★★ | 色阶/色差比较明显,对渐变类图支持不好 |
RGB16 | Android/iOS | 无 | 16 | 无 | ★★★★ | 色阶/色差比较明显,对渐变类图支持不好;不支持透明通道 |
ETC | Android | 非OpenGLES2.0的机型 | 4 | 长宽为2次方 | ★★★ | 不支持透明通道 |
ETC2 | Android | Android4.3以下 | 4,带A的8 | 长宽为2次方 | ★★★ | 支持透明通道,画质适中,基本满足大部分UI需求 |
PVRTC | iOS | 无 | 4 | 长宽相等,均为2次方 | ★★★ | 支持透明通道,对长方形贴图不适用 |
ASTC | iOS | iPhone5S、iPad mini2、iPad Air | 3.56(6X6)、5.12(5X5) | 无 | ★★★ | 支持透明通道,多种方式可选,基本满足大部分UI需求 |
注:
1. 可以根据像素深度计算内存占用大小,比如一张800*800使用RGBA32压缩格式带透明通道的贴图,内存占用情况为
(800 * 800 * 4) / 1024 / 1024 = 2.44MB
2. iOS的ASTC有多种压缩格式,上述表格只列举了两种(5X5和6X6),其余格式如下,
压缩策略的选择
压缩策略主要是针对不同用法的贴图选择最佳压缩格式,对于清晰度要求极高的就可以选用RGBA32,否则尽量选择其他方案以优化内存。一般可以分为三个方向:
- 高清晰无压缩:RGBA32,除非贴图效果不尽人意,否则尽量少用这种格式。
- 中清晰中压缩:RGB(A)16,物品贴图、头像、卡牌、标签等,不能使用于带颜色渐变的贴图。
- 低清晰高压缩:ETC4和PVRTC,UI、卡牌、标签等,Unity默认使用的格式,基本满足大部分需求,清晰度不足时可以转用RGB(A)16。
实现编辑器自动检查
使用编辑器代码对导入的贴图资源进行自动检查,避免每导入一张贴图就设置一次压缩格式,方便维护和拓展。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class MyTextureProcessor : AssetPostprocessor
{
void OnPreprocessTexture()
{
//非该路径下的Texture不设置
if (!assetPath.StartsWith("Assets/MyTexture")) return;
TextureImporter import = assetImporter as TextureImporter;
if (import == null) return;
import.textureType = TextureImporterType.Sprite; //设置图片为精灵类型
importer.spritePackingTag = "Texture/GUI"; //图集打包
importer.mipmapEnabled = false; //关闭mipmap
importer.isReadable = false; //关闭Read/Write Enabled
TextureImporterPlatformSettings settings = new TextureImporterPlatformSettings();
settings.name = "Android"; //设置需要压缩的平台
settings.overridden = true; //勾上override
settings.textureCompression = TextureImporterCompression.Compressed; //正常压缩
settings.format = TextureImporterFormat.RGBA32; //选择RGBA32压缩格式
settings.maxTextureSize = 2048; //分辨率设置为2048
import.SetPlatformTextureSettings(settings);
}
}
将上述代码复制到新建的C#文件中,新导入的图片就会自动完成压缩而无需手动设置。