技术分享连载(五十七)

技术分享连载(五十七)

本期聚集话题:CPU和GPU的性能消耗、AssetBundle 兼容性、Animator精度优化、如何卸载引用资源...


精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:465082844


性能

Q1:在整体的性能消耗上,CPU和GPU各占一半合理吗?如果不是,各占多少为好?还是说需要根据机型来看?其次,我如何知道游戏在手机上的GPU消耗?Profiler是看不到的,有工具推荐吗?

首先,CPU和GPU是并行的,也就是CPU在运算的时候GPU也在运算,一帧的结束时间是两者中比较晚结束的那个。因此,一般我们在考虑这个问题的时候,经常会说是CPU bound还是GPU bound,也就是GPU在等CPU还是CPU在等GPU。最理想的情况是两者都并行均衡,且都没有出现互相等待的情况。但在目前的大多数移动游戏中,都是CPU耗时为主要性能瓶颈。这也是为什么有多线程渲染的原因,多线程渲染就是利用CPU端的并行性,让CPU处理得更快,不拖后腿。

其次,对于GPU的压力分析,可以尝试用Intel GPA,Mali或者高通出的针对自家芯片的工具。


动画优化

Q2:UWA DAY 2017中提到“Animator优化可以把精度从8位减到3位”是什么意思?如何实现呢?

Unity的动画文件中每个关键帧数据的数值精度会达到小数点后6位以上(如下图一)。在Unity中可以通过将菜单“Edit->Project Settings->Editor”中的Asset Serialization选项设为"Force Text"获得动画文件的文本,然后通过文本处理将所有数据数值精度降低到小数点后3位(如下图二),这样可以使动画文件的大小降低。

请输入图片描述
图一

请输入图片描述
图二

以133s的动画文件为例,在不开启压缩时,其内存大小为31MB,使用Keyframe Reduction选项可以降为8MB,进一步经过降低精度后,可以降为3MB。


资源管理

Q3:我用DestroyImmediate 和 Resource.Unload 来进行卸载Prefab,在卸载前我获取Prefab下所有的材质,发现有些文件无法卸载,类似下图中的MangedStaticReferences(),怎么卸载这些资源呢?

请输入图片描述

从图片上来看,这个是资源被逻辑代码缓存的问题。图中YangCheng纹理之所以无法卸载,是因为它被YangCheng材质所引用,而YangCheng材质又被UIAtlas脚本所引用,ManagedStaticReferences表示此资源最终是被逻辑脚本所引用,即可能某个脚本中的变量或者Container对其仍有索引。从该图来看,很可能是使用到该Texture的某个UI GameObeject没有被释放所致。建议研发团队可以检测一下具体使用YangCheng材质的索引情况,定位其被索引的原因。一般主要有两种可能,一是它自己本身被储存于脚本变量中,二是引用它的GameObject被储存于变量中。研发团队可先从以上两方面入手,对该资源进行检测和排查。


资源管理

Q4:我们项目做AssetBundle打包时,发现如果资源所依赖的C#Script的Public成员变量有变化时,用新代码加载旧的AssetBundle就会不兼容。有没有什么方法能判断这些Script在变化时是否需要重新打AssetBundle呢?目前我们使用.CS文件的MD5来判断是否需要重新打包,但其实这样应该有很多不必要的重复打包,对吗?

该问题的本质原因是新代码的序列化信息变化所致。建议研发团队使用Unity 5的新的AssetBundle打包方式,默认情况下,Unity 5引擎会自动检测其脚本的序列化信息是否进行改变,从而自动进行增量打包。


资源管理

Q5:Unity的材质的宏是有材质用到时才会被编译吗?还是说不手动Skip都会编译?

在Unity中shader variant也包含两种类型,一种是通过 shader_feature 定义,一种是通过 multi_compile 定义。而只有通过 shader_feature 定义的 variant 在发布时会根据其使用情况来进行剥离。具体可见Unity官方的文档:https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html

需要注意的是,放在Always Included Shaders中的Shader,其包含的所有 variant 都不会被剥离,因此对于Standard Shader这类包含了大量 shader_feature的Shader,不推荐将其放入。

今天的分享就到这里。也欢迎热爱进步的你加入UWA的QQ群(465082844),也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。