3

最近做的一个小游戏在美工提交了一批角色模型后,发现一生成角色的时候就会卡一下。分析原因后发现贴图占用内存太大,优化后做个总结。

1.分析原因

既然是生成新角色的时候卡了一下,那么问题原因就定位在生成新模型的过程上。打开性能分析器看下CPU和内存情况,发现内存出现大幅波动。

(1)未生成角色前:贴图占用内存:27.4M
未生成角色前

(2)生成1个角色:贴图占用内存:52.7M
1个角色增加了25M内存
生成1个角色

(3)生成6个角色:贴图占用内存:189.5M
6个角色增加了162M内存 平均每个增加27M
生成6个角色

(4)查看角色下所有材质和贴图
角色皮肤贴图:
角色皮肤贴图

皮肤贴图格式:
占用内存大小

皮肤贴图大小:
皮肤贴图大小

角色表情贴图:
角色表情贴图

表情贴图格式:
表情贴图格式

表情贴图大小
表情贴图大小

2.解决方法

调整图片格式

(1)调整贴图类型 Texture Type:
该贴图不是UI, Texture Type = Default 默认类型。

(2)调整是否支持透明度通道:Alpha Is Transparency
皮肤和装饰不需要透明度,Alpha Is Transparency = X 不勾选。
表情需要透明度,Alpha Is Transparency = √ 勾选。

(3)调整生成小贴图选项 Generate Mip Maps:
角色移动范围有限,不需要生成小贴图 Generate Mip Maps = X 不勾选。

(4)调整循环模式 Wrap Mode:
不需要平铺贴图 Wrap Mode = Clamp 强制拉伸(Repeat 为 重复)。

(5)调整过滤模式 Filter Mode:
需要平滑一下 Filter Mode = Bilinear 双线性过滤。
Filter Mode 用于纹理的过滤模式。在纹理检视面板对应设置。
Point 点过滤 - 纹理像素成为近似块。
Bilinear 双线性过滤 - 纹理取样的平均值。
Trilinear 三线性过滤 - 纹理取样的平均值,也混合mipmap等级。

(6)调整最大尺寸 Max Size:
贴图是2048x2048分辨率,美工给的是高清贴图,没毛病。
贴图的默认参数远大于我们的需求,需要我们根据需求自己改一下格式。用QQ截图测量了一下,角色距离相机最近的时候,最大宽高也没超过100x100像素,128x128足以满足项目需求。角色移动范围很小,不会远离摄像机,不需要生成Mip Map。

(7)调整压缩质量 Compression:
Compression = Normal Quality 默认的一般质量即可。

3.调整后:

6个角色贴图占用内存:32.3M(内存下降157.2M)
平均每个角色占用内存:0.82M(内存下降26.2M)
调整后内存大小

4.总结:

美工或策划提交的资源,程序更新后一定要过一遍,做到心里有数。
纹理贴图是内存大户,要严格监控,根据项目需求修改贴图属性尤其是对贴图的类型,最大尺寸,压缩质量进行修改。确保不浪费性能。有时候像表情贴图这种体积不大的png,也会占用巨大的内存。

性能优化从来不是一蹴而就的事儿,与其卡的时候优化那1%最后的稻草,不如前面99%的细节都做好。

安心的吃吧,孩子们,爸爸爱你们。
图片描述

转载请标明原文地址:https://segmentfault.com/a/11...


冰封百度
233 声望43 粉丝

Unity游戏程序员一枚。生命不息,学习不止。