如何优化WaitForGPU

如何优化WaitForGPU

本期聚集话题:如何优化WaitForGPU、如何用DrawMeshInstanced给每个物体指定不同的颜色、Unity导入模型时选项Swap UVs的作用、角色换装模型合并问题...


这是第110篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间15分钟,认真读完必有收获。
UWA 问答社区answer.uwa4d.com
UWA QQ群:793972859(仅限技术交流)


渲染

Q:最近做一个VR的Demo,使用Unity 5.6.3版本开发,发现当近距离观察模型细节的时候突然就变得特别卡顿,帧率从95FPS降到了45FPS,如下图:

图示为正常距离观察模型没有问题,帧率正常。
请输入图片描述
图示为近处观察模型时,帧率下降严重,VR.WaitForGPU占比很高。
请输入图片描述
想请教大神,为什么近距离观察会导致VR.WaitForGPU这一项升高呢?

UWA:估计是ALU的问题使得GPU压力过大,其根本原因还是模型上Fragment Shader的指令集过高,从而导致渲染的Pixel数量越大,其GPU开销就越高,类似于我们在UWA Day 2018上关于Standard Shader的屏占实验。在低端设备上,屏占超过20%,其GPU耗时就已经超过20ms。
请输入图片描述
请输入图片描述
WaitForGPU过高,说明此时GPU是性能瓶颈。对此,建议题主检测下自己的情况是否如此。

该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5ae9759532493548fbd32c2e


制作

Q:Unity官方的描述如下:Swap UV channels in your Meshes. Use this option if your diffuse Texture uses UVs from the lightmap. Unity supports up to eight UV channels but not all 3D modeling applications export more than two.
不过我不太理解该描述,我自己尝试时,无论是否使用了Lightmap,这个选项勾选或不勾感觉模型都没有什么变化。请问在什么情况下需要勾选呢?它交换UV通道的意义是什么?

UWA:之前的document里的描述:

Swap UV:Use this if lightmapped objects pick up the wrong UV channels. This will swap your primary and secondary UV channels.
现在的描述里有:Use this option if your diffuse Texture uses UVs from the lightmap.

以及可以看一下这个帖子里关于这个选项的讨论:https://forum.unity.com/threads/poll-is-swap-uvs-mesh-import-setting-useful-for-anyone.173468
看起来像是Lightmapped模型出现贴图混乱的时候才用的,,例如从某些建模软件(例如blender)导入的带多个uv通道的模型。

该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5ae9b63b6b104d27ac3aac4c


渲染

Q:用DrawMeshInstanced这个API来渲染多个物体的时候,应该怎么给每个物体指定不同的颜色?这个接口的参数里面有个MaterialPropertyBlock,但却不是数组,不能指定多个颜色。

UWA:如果不是通过这个接口,而是放置物体在场景里,那么确实可以给每个物体指定不同颜色属性的MaterialPropertyBlock来实现。
但如果用这个接口,那么只能指定一个MaterialPropertyBlock,所以可以尝试指定一个数组,比如SetFloatArray,然后在Shader里通过数组里的值来取(或者计算)各自对应的值,作为颜色。

该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5af0191b0e95a527a7a81cd3


制作

Q:大家熟悉模型合并或角色换装吗?当使用两次合并后,第二次合并后的UV不对,有什么办法解决吗?

比如,我们A(aMat),B(bMat),C(cMat),D(dMat)四个部件:

1)第一次使用CombineMesh(coms, true , false)合并 A、B、C网格(combineMesh1)并且整合材质 atlasMat。
2)第二次使用CombineMesh(coms , false , false)合并combineMesh1 ,D 网格(combineMesh2)并且移动材质到同一个Renderer。
最后ABCD被全部整合到combineMesh2,Renderer的材质变成2个(atlasMat + dMat)。我现在的问题是,dMat的UV显示不正常,请问会是什么问题呢?

如果Mesh只有一个,多个Material会有问题。
请输入图片描述
另外,显示不正常是因为一套UV对应了两套贴图。
要么把D Mesh的UV改到UV1(UV2、UV3、UV4)上,但是需要改dMat的Shader,而且会增加DrawCall。
要么连同dMat的贴图一起合并到atlasMat上。

感谢凯奥斯@UWA问答社区提供了回答,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5ae2987a095683490075263c


粒子系统

Q:我用的是Unity 2017.1.3版本,特效人员在粒子系统上使用了trails模块,然后为了形成拖尾要使用world space,结果在游戏中发现整个粒子包围盒计算出了问题,导致剔除操作时出错。而且是离原点越远偏差越大,特效在原点就没偏差。请问有没有解决的方案?
请输入图片描述
请输入图片描述

UWA:我找了一个采用CullingGroup的方案,你看看是否满足要求。解决思路是用CullingGroup的可见性来裁剪粒子系统,具体做法如下:
1)在粒子系统的坐标位置放置一个CullingGroup,并设置其好包围球的半径;
2)利用CullingGroup的可见性以及onStateChanged事件来更新粒子系统的可见性。

该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5adf13d13dba2a108c7e32f4


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

本文封面图来自网络