技术分享连载(十一)

技术分享连载(十一)

本期话题:Mono对性能的影响、关于抗锯齿和BLOOM的优化、GPU 开销...欢迎转发分享,未经作者授权请勿转载。同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UWA 问答社区:[answer.uwa4d.com][1]
UWA QQ群2:793972859(原群已满员)

以下所有解答由UWA原创,请微信搜索uwatech。


内存管理

Q1:正常情况下游戏如果一直玩下去,Mono是不是会一直增加? 比如频繁打开一个界面,界面里有脚本会不断创建一些东西 ,那么Mono是否会不断增加?对性能上会不会造成影响呢?

A:Mono 确实是不会下降,但并不应该一直上升。
创建出来的东西,如果被引用在一个容器里,或者被某些脚本的变量引用,那么这部分堆内存就释放不掉;但如果没有被任何容器或者变量引用(比如,临时拼一个 String),那么这部分堆内存会在 GC 的时候释放(释放是指变为空闲的堆内存,堆内存的总量是不会下降的)。
对于后者,频繁地 new 对象虽然不会一直增加堆内存,但是会加速 GC 调用的频率,所以同样是需要尽量避免的。


图形渲染

Q2:关于抗锯齿和BLOOM,有什么好的优化方案或者优秀插件推荐?

A:通常在中低端的设备上,抗锯齿并没有比较高效的方案;而对于中高端的设备,可尝试直接使用 Unity 内置的 MSAA 功能,但也只推荐使用 2x。

关于Bloom效果,以下是适用于移动端,且评价较好的一款插件:BloomPro
UWA Tech Doc
UWA Tech Doc


UI输入

Q3:我们在编译安卓版本时,在某些设备上(Sony L36h,小米4)调试时,发现有一个时间消耗项叫Graphics.PresentAndSync,该函数对性能的消耗会特别夸张(渲染20毫秒,这个能达到50毫秒)。查了相关文档,发现该函数好像和安卓设备的垂直同步有关,但是大部分安卓设备的垂直同步是不可以关闭的。请问有什么好的办法解决吗?

A:概括来说,该值很高表示 GPU 负担很重,可以从降面,或者简化shader入手。

Graphics.PresentAndSync 是指主线程进行Present时的等待时间和等待垂直同步的时间。该参数在Profiler中CPU占用通常较高,且仅在发布版本中可以看到。究其原因,其实是CPU和GPU之间的垂直同步(VSync)导致的,主要是与项目是否开启多线程渲染有关。当项目开启多线程渲染时,你看到的则是Gfx.WaitForPresent;当项目未开启多线程渲染时,看到的则是Graphics.PresentAndSync。

其中的原理,可以参照我们之前对其函数的详细解释:扒一扒Profiler中这几个“占坑鬼”。


UI输入

Q4:我们使用UGUI,Sprite一般都选择默认的格式了,Compressed,但是在iOS设备下就会糊,用TrueColor就很大,请问一般该如何处理呢?

A:这确实是没办法的,如果选 Compressed (默认会选择 PVRTC 格式)比较糊,那么可以尝试 RGB16,如果还是觉得糊,只能尝试 RGB32。

一般来说,渐变色在压缩时会明显失真,可以尝试避免,这其实是内存和效果的权衡,并没有最优的方案。


图形渲染

Q5:我们这种英雄UI,里面嵌了一个类似场景的Prefab,开了实时光照之后内存就特别高。这种不属于场景,又没有办法烘培,有没有什么好的建议呢?
UWA Tech Doc

A:首先,理论上开实时光对内存是没什么影响的。

开发团队可以尝试烘焙,因为Unity 5.x 中也是有办法进行动态加载Lightmap 的,只是需要通过脚本将烘焙时每个物件的Lightmapindex和Lightmapscaleoffset记录下,并在运行时动态加载后设置回去的方式来实现。因为目前Lightmapindex和Lightmapscaleoffset信息是和场景绑定在一起,储存在Lightmapsnap.assets 中,发布时也是放在场景信息中,因此不会记录在Prefab 上。


【技术分享】是UWA推出的技术交流栏目,我们会定期将开发团队中反馈的常见问题加以总结并梳理在此,以供大家参考。