为了资源规范,或者为了内存优化,对资源进行预处理是很重要的。
写一个编辑器脚本继承AssetPostprocessor类,当资源导入时,对资源进行规范处理,这个最好是在项目开始时就要做好。避免项目越来越大,资源越来越多,后期再处理的话,就会花费大量时间和精力。
关于资源导入的回调函数,这里截取一张官网上的图片作为参考,具体参照官网,在资源首次导入或导入设置发生改变时触发。
当按照规范对资源的设置进行更改后,需要调用SaveAndReimport函数进行保存,这个函数会再次导入资源,触发对应回调,为避免无限的循环导入,在写代码时,务必要判断一下当期的设置是否与目标设置一致,只有不一致时,才更改并保存。
不同项目的资源规范不同,但一些通用的设置还是一致的。
像这种资源设置的规范,完全可以在资源预处理中进行自动处理。只需要在资源制作时,按照相应的规范进行处理即可(比如某个项目会根据资源中是否包含某些特定字符串对资源进行处理,这种就需要资源在命名时,按照这个项目的要求进行命名)。
尽可能的关闭模型的read/write enabled标记。也就是说最好不要在代码中对模型进行读写,如果启用此标记,会在CPU和GPU中各自保存一份数据。unity会默认关闭,避免误操作,可以在导入时对其设置进行修改。即使关闭了此选项,在着色器中也可以正常访问模型数据。
对于UI的图片,禁用Mipmap,可节省内存。为何不在模型的图片上禁用此选项,是因为当距离摄像机Z有变动时,禁用此选项会导致GPU在纹理采样时性能变差,而一般情况下,UI相对于摄像机的距离Z是不变的。
确认纹理格式。如果纹理压缩格式不适合目标平台,Unity会在加载纹理时解压缩,消耗CPU和额外内存。
根据项目确定纹理的大小限制。
非角色模型禁用骨架。如果不禁用,在运行时就会自动添加Animator组件,这会使动画系统增加不必要的开销。
对于动画模型,启用Optimize Game Objects选项。如果禁用该选项,Unity在每次实例化模型时会创建一个大型变换层级来镜像模型的骨骼结构,还限制了Unity通过多线程执行网格蒙皮和骨骼动画计算的能力。如果需要暴露模型骨骼结构上的特定位置,比如用来动态附加武器模型,则可以在Extra Transforms列表中将这些位置专门列入白名单。
尽可能压缩网格。但是这样做可能会导致精确度的轻微丢失,所以需要评估这种轻微丢失是否影响游戏,对于不同的通道选用不同的级别的压缩,可以选择仅压缩切线和法线,同时保持UV和顶点位置不压缩。
网格渲染器的设置。网格渲染器默认会启用阴影投射和接收,光照探针采样、反射探针采样和运行矢量计算,如果项目中不需要这些功能,可以禁用。
导入的音频文件无需压缩。在导入时,Unity会自动压缩,如果导入的资源是压缩过的,会降低最终音频的质量。
对于UI音效,音频设置为单声道。很少有移动设备实际配备立体声扬声器,设置为单声道可以使内存减半。
尽可能在不影响效果的情况下,降低音频的比特率。会进一步节省内存消耗和项目包大小。
对于以上的这些建议,完全可以在项目确定时,编写相应的编辑器代码,在资源导入或设置变更时,会自动进行设置。
上一篇:App的启动时长分析优化
下一篇:代码部分的优化建议