技术分享连载(六十二)

技术分享连载(六十二)

本期聚集的话题:Static Colider.Move性能开销、耗电发热该如何优化、Resources加载和AssetBundle加载的区别、渲染模块中的Mipmap设置


我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:793972859
UWA 问答社区:answer.uwa4d.com


资源管理

Q1:在Unity 的 Profiler里,有些记录右边会有Warning的个数信息,请问这个是否影响性能,或者是否有必要修改呢?

请输入图片描述

这种字符的出现很可能会导致后续的物理更新出现较大的性能开销,包含在Physics.Simulate/Processing中。出现这种情况主要是受限于Unity版本中的PhysX在移动静态碰撞体是开销较高的问题(虽然文档中说5.x下已经解决,但我们确实发现在5.x的项目中该项仍然存在)。因此,我们建议给需要移动的Collider加上RigidBody并勾选Is Kinematic复选框,从而将其变为动态碰撞体,如下图所示。对于不移动的物体,则直接将模型的Apply Root Motion选项进行关闭,从而直接省去Static Collider.Move的性能开销。
请输入图片描述


资源管理

Q2:我们设置了TargetFrameRate为30,想避免过高的耗电和发热,请问这样做是合理的么?

这种设置仅在帧率本身很好的情况下,才会起到减少耗电和发热的作用。但如果本身游戏已经较为卡顿,那么该设置方法意义不大。对于耗电和发热,研发团队需从CPU、GPU和IO入手,尽可能降低这三方面的负载压力,比如:

(1)CPU:针对UWA性能测评报告中的Top10函数进行优化,根据性能堆栈定位性能根源并进行优化;
(2)GPU:针对报告中的OverDraw对GPU负载较大的根源进行完善和优化;
(3)IO:尽可能控制资源加载的粒度和网络传输的频率。对于资源粒度的划分,我们曾有过较为深度的分析:可以参考《技术分享连载五十九》


图形渲染

Q3:我们美术在制作场景地面的时候,会有如下图所示的非常明显的一条模糊和清晰的分割线。我清楚这是由于Mipmap的使用导致的,我们不想让这条线这么明显,初步的想法是设置Texture的mipMapbias这个参数,这个参数没有在Texture的配置界面上提供。
请输入图片描述

Q3.1:想问下Unity有没有办法全局设置这个值?或者只能像我们现在这样在贴图导入的时候由脚本来设置?官方给的这个值的建议是“Note that using large negative bias can reduce performance, so it’s not recommended to use more than -0.5 negative bias.”,按照我之前的理解,这应该对应到Mipmap偏移层数的设置,应该是个整数。

目前来说我们没有发现能全局设置的办法。

Q3.2:不清楚这个建议不超过-0.5的值具体含义是对应几层Mipmap偏移?

Mipmap的层级数的确是一个整数。mipMapbias是由Unity引擎定义的一个参数,按照Unity官网解释来看整数代表了比当前层级更低(级数更大,更模糊)的Mipmap,负数代表了比当前层级更高的Mipmap。“-0.5”具体是偏移多少层级目前也不是很清楚。

Q3.3:我们也尝试了Trilinear的Filter Mode设置,并没有明显的效果,按理说这个设置应该是会让Mipmap采样两层中的8个点进行混合,这点也有点奇怪。

Trilinear应该是会比Bilinear效果好一些,但是也差强人意。原因是这样:传统的Mipmap(不采用Anisotropic Filtering)都是每层将u,v两个方向缩减一半,即:512x512的下一层是256x256。这就导致在两层交界处在不同层采样出来的纹理在u,v两个方向都被拉伸(或者叫变模糊)。Anisotropic Filtering的方式可以简单理解为在交界处只在某一个方向上被拉伸,另一个方向保持原有采样率(或者叫纹理分辨率),这样才能明显降低突变的模糊感。

Q3.4:目前我们给美术的建议是使用Aniso Level,调整一个比较高的值,比如大于6,会有比较理想的效果,但是查了一下这个的性能消耗貌似很大,不知道UWA有没有对这个参数做过性能的分析,具体的性能消耗有多大?

使用Anisotropic Filtering不仅纹理内存占用会增高,而且采样率也增高(因为有一个方向的保持不变),因此它比传统的mipmap更耗时,耗时在于GPU端对纹理进行采样时增加了访存,在CPU端没有影响。虽然Anisotropic Filtering 耗时增加,但是相比于直接增加mipmap level(也就是设置-0.5的偏移),要达到相同的效果,Anisotropic Filtering的时间耗时还是相对更低的。这个参数影响的是GPU端的时间开销,我们没有单独统计过,研发团队可以尝试提交一个版本到UWA网站上(www.uwa4d.com),我们从整体效率进行分析检测。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/590198b09db5d16c66166148
如您对该问题仍有疑问,可以转至社区进行进一步交流。


资源管理

Q4:我们使用的是Resources.Load和LoadAsync的方式加载资源,这个与AssetBundle的方式比较,能大概帮解释一下优劣么?

目前大量项目都在使用AssetBundle进行加载。相较于Resources加载,其好处有如下几个:
(1)游戏启动更快,Resources文件夹下文件数量越多,游戏启动越慢,而AssetBundle的使用可以极大减少Resources文件夹下的文件数量;

(2)更方便于资源的加载和热更新,AssetBundle可以让资源组织更为灵活,根据项目的不同情况,可以更为方便地对部分模块进行预加载或热更新。


资源管理

Q5:在Unity工程里启动游戏时,会有大量的Warning(类似定义了没有使用的变量这样的Warning)请问这个对真机的性能是否有影响,是否有必要修改掉这些Warning?

如果在真机运行时,依然会存在这些Warning,那么对于性能来说是有影响,建议尽可能将其去掉。而像问题中提到的"类似定义了没有使用的变量这样的Warning",这种属于编译时候的Warnning,是不影响运行时性能的。

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站(answer.uwa4d.com)上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(仅限技术交流)