Unity分享(85)|资源管理方式|UI相机性能开销|HDR...

原文链接:
https://blog.uwa4d.com/archives/TechSharing_85.html

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

UWA QQ群:465082844
UWA 问答社区:answer.uwa4d.com


渲染

Q1:我看到很多炫酷的效果都是用Unity的后处理来实现的,要求Camera开启HDR。但是我不知道开了这个选项会不会很耗,在中低端机上能跑起来吗?另外,使用HDR之后,Camera的Rendering Path是不是不能选Forward?

使用HDR可以选Forward,和Rendering Path的选择并不会相互影响。 在手机上单纯开启HDR(fp16)性能的影响并不会很大,各种后处理Pass的开销是要优化的重点。因为一般不会单纯开启HDR而不使用后处理,综合考虑到发热量等因素,不建议低端机器使用HDR和后处理,中高端再开启HDR并配合后处理,并对后处理做基础优化:比如适当降低后处理分辨率,尽量合并多个后处理流程到一个Pass等。

该问题来自UWA问答社区,感谢贺甲提供了回答,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/59f810692f7f63497e0f6baf


渲染

Q2:Unity5.5 运行中,材质球的GI选项在烘焙的时候,代码修改模型Renderer组件所引用的Material属性,SetColor(“_EmissionColor”),没有实时刷新效果。

代码如下:

Renderer[] renderers = (Renderer[])mesh.GetComponentsInChildren();
foreach(Renderer r in renderers)
{
    r.sharedMaterial.SetColor("_EmissionColor", new Vector4(0.5f, 0, 0, 1));
}

测试中发现,必须要Editor中选择这个材质球才能刷新。

经测试发现将材质中的GI设成“Baked“之后,如果_EmissionColor的初始值是0,则Unity会直接关闭Standard Shader的“_EMISSION”Keyword,导致设置_EmissionColor对渲染结果无影响。解决方法是设置同时打开“_EMISSION”Keyword,即加上: r.sharedMaterial.EnableKeyword("_EMISSION");

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


渲染

Q3:下面两张图是mate9+OpenGL运行我们项目最高画质时的Proflier截图,Unity 5.6.0p4,可以观察到下图一中第二个Camera.Render出现了一个非常长的等待,这个是我们的UI相机。从图中可以观察到它在等待其他相机完成渲染线程的任务后才开始执行自己的主线程渲染任务。

Unity分享(85)|资源管理方式|UI相机性能开销|HDR..._第1张图片

而下图是关闭了大部分UI,UI相机依然工作,但并没有出现这个异常的等待,我们观察到上图中第二个Camera.Render的首个任务是WaitForJogGroup,并且Job Thread在相同时刻出现了Particle Job,我们怀疑只要这个相机出现了particle system就会出现这种情况,但暂未确定,不知道各位是否有遇到这种情况,以及Unity是不是存在这个问题,如果是5.6的问题,那么后续的版本是否有解决呢?

Unity分享(85)|资源管理方式|UI相机性能开销|HDR..._第2张图片

这种情况在Unity 5.6版本中经常出现,不管是Unity 5.6.0还是最新的5.6.3,这种情况都是普遍存在的,下图是我们刚刚优化过的一个项目中的Timeline截图(Unity 5.6.3版本),而这种情况在5.6版本之前是很少出现的。


Unity分享(85)|资源管理方式|UI相机性能开销|HDR..._第3张图片

这种问题在我们来看,主要是有两点原因:

(1)Unity 5.6版本中将更多的渲染计算从主线程中搬到了渲染子线程中处理,而主线程还需要等待子线程的操作结果才能继续进行,从而造成了问题图二的主线程“等待”现象,即Camera.Render的Self开销;

(2)本质原因还是单帧渲染量太大,如题主遇到的UI界面渲染、粒子系统渲染以及蒙皮网格计算等,如果量大都是有可能造成子线程压力过大的,所以虽然很多项目中开启了多线程渲染功能,但还是需要对渲染量时刻保持关注。

目前我们还没有接触过过多的Unity 2017项目,所以目前暂时无法给出统计数据。建议题主可以尝试先回退到Unity5.5的最新版本中进行一个尝试,看看问题是否有好转。

题主补充
最后深入测试证明2017.1依然是有问题的,只是wait的时机换了:render时不再wait了,但particlesystem.deactivate的时候会进行wait,所以可能会出现这样的timeline:

Unity分享(85)|资源管理方式|UI相机性能开销|HDR..._第4张图片

2017.2未测试但估计也不乐观。

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


加载

Q4:如下图,释放了资源,但纹理还在内存中,且引用数为0,要如何销毁呢?
纹理所在的UI的GameObject是通过Destroy销毁的,并且执行了Resources.UnloadUnusedAssets();

Unity分享(85)|资源管理方式|UI相机性能开销|HDR..._第5张图片

Ref Count为0应该就是可以通过Resources.UnloadUnusedAssets或Resources.UnloadAsset来进行卸载了。出现这种情况建议如下:

(1)尝试将Resources.UnloadUnusedAssets在Destroy稍后几帧执行;
(2)在加载时尝试直接获取这些资源,然后在Destroy后通过Resources.UnloadAsset来卸载指定资源。

建议先从(1)来进行尝试。

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


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

你可能感兴趣的:(Unity分享(85)|资源管理方式|UI相机性能开销|HDR...)