技术分享连载(六十五)

简介:

性能优化

Q1:在UWA性能报告中,看到PutGeometryJobFence开销较高,请问这个该如何进行优化?
请输入图片描述

就目前我们所优化过的项目而言,推测PutGeometryJobFence是Unity项目的主线程在等子线程的一些网格计算操作完成,其在不同的模块中均有出现(UGUI模块、渲染模块、Mesh.Skin操作、Animator动画模块等等),出现的地方不同,其本身含义也并不相同,不能一概而论。

而就上图中的耗时来看,如果项目中使用了UGUI,那么很大几率(>80%)是由于UI模块的不合理操作所致。我们在Unity5.3~5.5版本中深度优化了多款手游,均不同程度地遇到了该值耗时较高的问题,并且该函数与WaitingForJob经常成对出现,特别是在Android平台上。

下图为一款我们深度优化的ARPG项目中,PutGeometryJobFence在游戏运行时的耗时开销。
请输入图片描述

通过现场进行定位,我们发现PutGeometryJobFence的开销,实际上是主线程在等子线程中的耗时完成的等待时间,且几乎全部是等待Canvas.GeometryJob,如下图所示。
请输入图片描述

因此,我们直觉猜测该UI模块的重建开销很高,以至于子线程的计算压力过大,而PutGeometryJobFence较高,也很可能是主线程的等待时间。为了验证这一猜测,我们开始大力定位和优化该项目的UI模块的重建开销,待调整和优化项目的UI模块后,其WaitingForJob的运行时开销大幅降低(接近于0ms),而PutGeometryJobFence的CPU耗时则基本上可以忽略不计了。
请输入图片描述

同时,需要说明的是,以上仅是我们目前在多款Unity5.3~5.5项目中的具体优化经验,但并不能说明PutGeometryJobFence耗时高就一定是由UGUI模块导致,随着Unity引擎的不断升级,其背后也会隐藏着更多的含义。因此,希望大家在优化时就具体问题进行具体分析、具体解决。


性能优化

Q2:下图中,函数"Transform.set_position"的开销很大,请问有办法优化吗?
请输入图片描述

从图中看,是通过Deep Profiler进行的函数耗时统计,首先Deep Profiler本身对于耗时的统计影响很大,通常在Deep Profiler下调用次数越多的函数,其耗时的统计就会越明显地偏高,因此,我们首先建议关闭Deep Profiler,同时用Profiler.BeginSample/EndSample将修改Position的代码包进来,再查看其耗时,相对会更加准确。

其次,可以观察到有180次的CanvasRenderer.OnTransformChanged的回调,移动UI元素相比于移动其他的元素确实会有额外的开销,建议减少不必要的UI元素的移动,比如通过增加移动阈值,降低移动频率等等。


性能优化

Q3:Unity Profiler中的Canvas.RenderSubBatch是否属于UI上渲染的开销?和重建有关系吗?
请输入图片描述

这个确实是UI模块(UGUI)的渲染开销,但是跟UI的重建并无太大关系,主要还是跟UI界面的渲染Draw Call相关。从上图中可以看出,UI Draw Call达到45个,该值较高,研发团队渲染对UI模块的Draw Call进行进一步优化。


性能优化

Q4:这个Clear的耗时为什么这么大,有什么可以优化的方法吗?
请输入图片描述

图中的Clear耗时确实很高,但需要研发团队关注该高值是小概率出现,还是经常出现。如果是前者,则无需过分担心,但如果是后者,则需要研发团队关注相机图像后处理操作的使用。Clear操作一般是用来清除Camera的各种Render Buffer,当图像后处理使用的越多,则同一帧中开辟更多的Buffer的概率也越大,从而造成Clear的开销也较高。对此,如果你的项目中Clear耗时较高,且高耗时较为频繁,则建议先关闭图像后处理操作,来查看该情况是否有所好转。然后再逐步开启各个图像后处理操作,逐步定位造成Clear较高的耗时根源。





原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
编解码 前端开发 图形学
|
缓存 前端开发 图形学
|
算法 图形学 iOS开发
|
前端开发 图形学
|
图形学 异构计算 前端开发
|
前端开发 API 图形学
|
编解码 atlas 图形学
|
Java Android开发 图形学
下一篇
无影云桌面