在Unity3D手游开发中,合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程,重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。
1. 现状分析:从ETC2到ASTC 6x6 block
在项目初期,统一采用ETC2作为主要的纹理压缩格式。这种格式在Android设备上的兼容性较好,但在细节表现和压缩效率上仍有优化空间。
通过测试,我发现 ASTC 6x6 block 可以在与ETC2相同的视觉质量下提供更好的压缩率。因此,我开始尝试将资源从ETC2转换为ASTC 6x6,并观察其对内存使用和加载性能的影响。
2. 选择ASTC 6x6作为主要格式
2.1 兼容性检查
虽然ETC2几乎在所有OpenGL ES 3.0及以上的设备上均受支持,但 ASTC 在现代设备上的支持率也非常高。为了确保兼容性,我们通过以下方法进行设备支持性检测:
// 检查设备是否支持ASTC 6x6
bool supportsASTC6x6 = SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6);
// 检查设备是否支持ASTC 5x5
bool supportsASTC5x5 = SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_5x5);
同时,我们也确保设备支持OpenGL ES 3.0,避免兼容性问题:
public static bool CheckSupportOpenGLES3()
{GraphicsDeviceType deviceType = SystemInfo.graphicsDeviceType;return deviceType == GraphicsDeviceType.OpenGLES3;
}
通过广泛的数据收集和日志记录,发现项目用户绝大多数设备都支持 ASTC 格式,因此决定将其作为主要的压缩格式。
3. 相关配套优化
3.1 自动检查格式工具的修改
为了自动化这一优化过程,我们对内部的资源检测工具进行了修改,使其能够:
-
自动检测并转换符合条件的ETC2纹理为ASTC
-
对于某些 不希望被压缩 的纹理(如RGBA32格式的特殊资源),保持原样,不进行转换。
-
允许手动标记精度要求较高的资源,自动选择 ASTC 4x4 或 ASTC 5x5 作为替代方案。
3.2 资源包适配不同设备
为了兼容少部分不支持ASTC的设备,我们采取了 双版本资源方案:
-
打包时生成两套资源:
-
ASTC 5x5 版本:大多数设备加载该版本,减少内存占用。
-
ETC2 版本:兼容性回退版本,仅用于不支持ASTC的设备。
-
-
运行时判断设备支持情况,选择合适的资源下载:
if (SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_5x5) && SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6) && CheckSupportOpenGLES3())
{// 下载ASTC版本资源
}
else
{// 下载ETC2版本资源
}
3.3 纹理效果测试与优化
除了兼容性优化外,还针对纹理的视觉效果进行了测试。
-
半透明渐变纹理问题:
-
发现某些带有半透明渐变的图片在使用ASTC压缩后会出现明显的“色带”(banding)现象。
-
解决方案:对于这类资源,继续使用 ETC2 或者 RGBA32。
-
-
高精度纹理优化:
-
某些对细节要求较高的纹理可以使用 ASTC 4x4 或 ASTC 5x5 替代 RGBA32。
-
结果表明,这样的替换方案在大多数情况下都能保持良好的画质,同时大幅减少内存占用。
-
4. 优化成果总结
经过以上优化,取得了以下成果:
-
内存占用降低了30% 以上,有效减少了RAM压力。
-
ASTC 6x6 block的包体大小甚至比ETC2还小点,由于有部分精度为5x5和4x4以及保留不压缩的格式,至少在包体大小没有变大甚至有优化的情况下,实现了更精细的精度控制。
-
加载性能优化,由于ASTC的高效压缩,资源的磁盘占用也相应减少。
-
兼容性良好,通过自动检测设备支持情况,确保了游戏在不同设备上的稳定运行。
-
视觉效果优化,针对特定场景调整了压缩方案,避免了画质损失。
5. 结论
本次优化充分利用了ASTC的压缩优势,使项目在保证兼容性的同时,大幅降低了内存占用。对于现代移动游戏来说,合理选择纹理压缩格式可以带来显著的性能收益,也值得在后续的优化中持续关注和改进。