UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - 包围盒
type: channel
link: https://blog.uwa4d.com/tag/包围盒/
items: 如何优化WaitForGPU

如何优化WaitForGPU
type: item
date: 2018-05-07T12:53:00+03:00
description: 本期聚集话题：如何优化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)并…