技术分享连载(七十六)

技术分享连载(七十六)

本期我们聚集了这些话题:GameObject.Active耗时、Font.CacheFontForText开销过高、Unity 5.X下烘焙Lightmap的UV缩锁定...


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


性能优化

Q1:Unity对GameObject.active()这个底层具体做了什么?因为在优化项目的时候看见有些界面active()这个函数造成的开销比较高,我采取的办法是移除摄像机的范围,这是参照UWA以前文章找到的办法,但是我还是想知道Unity对Active底层具体做了哪些操作,否则会有点困惑。

有一点可以明确的是,至少SetActive后,如果GameObject被激活,那么会调用该GameObject和所有子GameObject上的所有组件的OnEnable函数。而各种不同的UI组件的OnEnable中也有各种不同的操作。 如果题主希望深入研究下,可以看一下NGUI或者UGUI的源码,OnEnable具体做了什么都可以看到。同时,针对UI界面而言,还会在同一帧里触发其他的相关函数,出现后续的开销,如UGUI里的SendWillRenderCanvases和NGUI里的UIPanel.LateUpdate。

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


资源管理

Q2:还是老生常谈的昼夜变换效果,需要两份Lightmap来lerp。开始我认为,只要模型不变,烘培参数不变,如果只改变灯光,Lightmap的分布是一样的(事实上开始测试的几个小场景也的确没问题)。但是在某个大场景烘培2份LM的时候,发现部分物体UV2分布的位置变了。请问,在不手动分uv2的情况下,是否有办法锁定UV2分布?因为资源量比较大,美术人员不希望手动分UV2。

根据我的实践结论,如果场景物体没有移动,没有改变过Lightmap Scale,光罩面板里的分辨率等参数也保持不变,只是灯光位置和参数发生了变化,那么是不会引起物体的光照Index和Scale 这两个参数的变化。但是为了避免多次渲染,最好连续为不同光线条件进行渲染,以防无意移动了某个物体,造成整份渲染无用。另外手动保存Index,Scale两个参数好像也是无效的,因为如果缺少场景同名文件夹内的Lightmapping Asset的那个光照文件,场景光照贴图就无法加载,而且通常我们场景内的物体是要批量静态的,而批量了后的物体是无法手动赋值Index和Scale这两个参数的。

实例:我的项目中
请输入图片描述
请输入图片描述
请输入图片描述
这三套光照贴图都是公用一套"UV"的,在编辑器中还可以自己写个Editor脚本来静态加载调试。
请输入图片描述

此问答来自于UWA 问答社区,感谢 ID为 Blandon 的朋友提供了相关回答,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5992e3aae85f22ea2dc0c603


资源管理

Q3:我们在iPhone5c上测试时发现Font.CacheFontForText会造成很严重的卡顿,看了UWA的Blog,了解到可能是因为创建FontTexture导致的开销。那是否可以认为如果我们一开始申请了足够大的Font Texture,后面即便有新的文字,开销也不会很大? 如果可以这么做,一开始申请使用的字符串是根据自己项目生成一个字典,还是直接使用网上3、4千字的常用字库更好?

是的,如果Font.CacheFontForText开销较大,那么在无法降低字体数量的情况下,一开始增大Font Texture是较为可行的方法。建议根据自己项目的字体来撑大Font Texture,避免不必要的浪费。 同时,也建议看一下这篇关于字体的精简优化方法

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


资源管理

Q4:有什么办法可以获取到MemoryProfiler里的Other那项里面的Objects和SerializedFile的详情信息呢?

目前Unity引擎是没有API来获取这两处的详细信息的。 不过,对于Objects的大小,一般来说不需要去特别注意,因为在真机上是没有的。 而SerializedFile下面主要是AssetBundle的具体使用情况,可在UWA线上性能检测版本中查看详细每帧的AssetBundle的使用情况,如下图所示。
请输入图片描述

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


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