贴图内存优化
Posted on
|
In
U3D
unity移动端贴图压缩格式
格式 | 通道 | 适用平台 | 压缩率1 | bits/pixel |
---|---|---|---|---|
RGB Compressed PVRTC 2 bits | RGB | Android(PowerVR),iOS | 8.33% | 2 |
RGBA Compressed PVRTC 2 bits | RGBA | Android(PowerVR),iOS | 6.25% | 2 |
RGB Compressed PVRTC 4 bits | RGB | Android(PowerVR),iOS | 16.67% | 4 |
RGBA Compressed PVRTC 4 bits | RGBA | Android(PowerVR),iOS | 12.5% | 4 |
RGB Compressed ETC 4 bits | RGB | Android,iOS | 16.67% | 4 |
RGB Compressed ETC2 4 bits | RGB | Android(OpenGL ES 3.0),iOS(OpenGL ES 3.0) | 16.67% | 4 |
RGB + 1-bit Alpha Compressed ETC2 4 bits | RGBA | Android(OpenGl ES 3.0),iOS(OpenGL ES 3.0) | 12.5% | 4 |
RGBA Compressed ETC2 8 bits | RGBA | Android(OpenGL ES 3.0),iOS(OpenGL ES 3.0) | 25% | 8 |
R Compressed EAC 4 bits | R | Android(OpenGL ES 3.0),iOS(OpenGL ES 3.0) | 50% | 4 |
RG Compressed EAC 8 bits | RG | Android(OpenGL ES 3.0),iOS(OpenGL ES 3.0) | 50% | 8 |
RGB Compressed ASTC 4x4 block | RGB | Android,iOS(A8) | 33.33% | 8 |
RGB Compressed ASTC 5x5 block | RGB | Android,iOS(A8) | 21.33% | 5.12 |
RGB Compressed ASTC 6x6 block | RGB | Android,iOS(A8) | 14.81% | 3.56 |
RGB Compressed ASTC 8x8 block | RGB | Android,iOS(A8) | 8.33% | 2 |
RGB Compressed ASTC 10x10 block | RGB | Android,iOS(A8) | 5.33% | 1.28 |
RGB Compressed ASTC 12x12 block | RGB | Android,iOS(A8) | 3.71% | 0.89 |
RGBA Compressed ASTC 4x4 block | RGBA | Android,iOS(A8) | 25% | 8 |
RGBA Compressed ASTC 5x5 block | RGBA | Android,iOS(A8) | 16% | 5.12 |
RGBA Compressed ASTC 6x6 block | RGBA | Android,iOS(A8) | 11.11% | 3.56 |
RGBA Compressed ASTC 8x8 block | RGBA | Android,iOS(A8) | 6.25% | 2 |
RGBA Compressed ASTC 10x10 block | RGBA | Android,iOS(A8) | 4% | 1.28 |
RGBA Compressed ASTC 12x12 block | RGBA | Android,iOS(A8) | 2.78% | 0.89 |
1:对比RGB24 或 RGBA32
unity自动做的优化
- normal map会被压缩成两个通道
unity提供的分析接口
- 文件大小
- UnityEditor.TextureUtil.GetStorageMemorySizeLong(Texture)
- 占用内存大小
- UnityEditor.TextureUtil.GetRuntimeMemorySizeLong(Texture)
- UnityEngine.Profiling.Profiler.GetRuntimeMemorySizeLong(Texture)
其中查看内存大小的接口在Editor下得到的数据会偏大,因为Editor下会创建一份贴图的副本。
如果贴图有生成mipmap,那么这份副本会从mipmap中拷贝,否则副本的分辨率等于贴图原始分辨率(别问我是怎么知道的)。
要在Editor下获得贴图的运行时内存占用,比较准确的方法是使用GetStorageMemorySizeLong方法2,再根据贴图的可读写标记决定是否乘以系数2。
2:在不开启Read/Write的情况下,GetStorageMemorySizeLong方法得到的大小和实际内存占用几乎没有区别。