在游戏测试中,我们测试游戏运行时性能最关注的指标是内存占用、cpu占用和FPS。那么当我们发现内存占比过大时,一般情况下都是图片资源优化的不好,今天我们就来谈谈图片资源在内存中的占用问题。
很久以前,我一直认为图片在内存中占用的大小跟图片在磁盘上的大小是一样的,读书少害死人啊。其实并非如此。
图片在内存中占用的大小与图片在磁盘上的大小没什么直接关系,而与图片的分辨率和程序中选用的像素存储格式有关。
常见的一种不压缩像素的格式是RGBA8888, 指的是红色通道、绿色通道、蓝色通道和alpha通道各占8位,也就是每个像素点占用4个字节的内存大小。那么我们来计算下一张分辨率为2048*2048的图片在内存中的占用,如果是RGBA8888格式,则内存占用为:2048*2048*4/1024/1024=16M 内存。
如果这张图片在磁盘上存储的为png或jpg格式,则大小可能与16M不一致。可见图片的内存占用与磁盘占用是没有什么直接关联的。
其他常见的内存像素格式为 RGBA4444,RGBA565, 这2种格式每个像素点占用2个字节,也就是同等分辨率图片内存占用会是RGBA8888的一半。
在移动游戏中,用RGBA格式的话,虽然图片质量较高,但是占用内存较大,尤其是对低端机可能影响较大,通常在ios手机上会采用pvrtc4格式,android手机上会使用etc1格式,他们都是每个像素点占用0.5字节,也就是同等分辨率图片占用只是rgba8888格式的1/8,但是图片效果会有所降低。
如果游戏中某些场景对图片质量要求不高,使用pvrtc4和etc1格式会有非常不错的效果。但是有个要求,就是需要图片的格式是2的n次方。假设图片像素点数不是2的n次方,那么会拓展到2的n次方来处理。举个例子:
比如说图片分辨率是1024*1024,那么pvrtc4占用的内存大小为1024*1024*0.5/1024/1024 = 0.5M。那么如果我们把图片稍微增加一点,增加到 1025*1025,虽然宽和高仅仅增加了1像素,但是内存会增加4倍,因为程序处理时会把1025处理成2的n次方,最近的是2048,最终内存是2M.
由上可知,如果我们想优化下游戏运行时占用的内存,可以从图片大小查起,尽量使图片大小都向2的n次方靠近,否则一张图片中几像素之差,内存占用可能就差了4倍。
发现那些与2的n次方差距较大的图片,果断让美术人员修改吧,切切拼拼,内存就会省出好多倍哦。
源自公众号 游戏测试风云录