由于诸多原因,渲染反射探针的立方体贴图需要大量的处理器时间:
必须使用探针原点处的“摄像机”单独渲染立方体贴图六个面中的每一面。
对于反射的每个反弹级别,探针都需要单独的时间进行渲染(请参阅高级反射探针的文档以了解更多详细信息)。
立方体贴图的各种 Mipmap 级别必须经过模糊处理才能进行光泽反射。
渲染探针所花费的时间会影响 Editor 中的烘焙工作流程,更重要的是会影响播放器的运行时性能。以下是将反射探针的性能影响降至最低的一些提示。
以下问题会同时影响脱机烘焙和运行时性能。
立方体贴图的分辨率越高,渲染时间就越长。可以通过在反射细节不太重要的位置设置较低分辨率来优化探针(例如,如果反射对象较小和/或较远,自然就会显示较少的细节)。在细节明显的位置仍应当使用较高的分辨率。
提高普通摄像机性能的一项标准技术是使用 Culling Mask 属性来避免渲染无关紧要的对象;该技术同样适用于反射探针。例如,如果场景包含许多小对象(例如,岩石和植物),可以考虑将它们全部放在同一层上,然后使用剔除遮罩来避免在反射中渲染它们。
要优化渲染时间并降低 GPU 内存消耗,请使用纹理压缩。要控制烘焙反射探针的纹理压缩,请打开 Lighting 窗口(菜单:__Window__ > Rendering > Lighting__),导航到 Environmental Lighting__ > Reflections__,然后使用 Compression__ 下拉菜单。请注意,在内存中不会压缩实时反射探针,这些探针在内存中的大小取决于分辨率和 HDR 设置。因此,采样实时反射探针通常比采样烘焙反射探针更耗费资源。
实时探针的渲染开销通常高于 Editor 中的烘焙探针。实时探针的更新可能非常频繁,如果管理不当,可能会对帧率产生影响。考虑到这一点,实时探针提供了以下属性,让您尽可能高效处理探针渲染:
通过 Refresh Mode 可选择探针的更新时间。就处理器时间而言,最耗费资源的选项是 Every Frame。此模式可通过最少的编程工作提供最频繁的更新,但如果对所有探针都使用此模式,可能会遇到性能问题。
如果此模式设置为 __On Awake__,探针将在运行时更新,但只在场景开始时更新一次。如果场景(或场景的一部分)在运行时设置好,而在其生命周期内不再改变,则此模式非常有用。
最后一个模式 Via Scripting 允许您从脚本控制探针更新。尽管在编写脚本时需要耗费一些精力,但这种方法确实可以实现有用的优化。例如,您可以根据经过对象的表观大小更新探针(即,小对象或远处的大对象不值得更新)。
上述 Refresh Mode 设置为 Every Frame 时,处理负载可能相当繁重。Time Slicing 允许您在几个帧之间分摊更新成本,从而减少任何给定时间的负载。此属性有三个不同的选项:
All Faces at Once 将立即渲染立方体贴图的六个面(在同一帧上),但六个第一级 Mipmap 中每一个的模糊操作将在不同的帧上进行。然后,剩余的 Mipmap 将在单个帧上进行模糊处理,并将结果复制到另一个帧上的立方体贴图。因此,完整更新需要九帧才能完成。
Individual Faces 与 All Faces at Once 的工作方式相同,只是立方体贴图每个面的初始渲染都在自己的帧上进行(而不是所有六个面都在第一帧上进行渲染)。完整更新需要十四帧才能完成;此选项对帧率的影响最小,但是假如光照条件突然改变时(例如,突然开灯),更新时间可能明显会相对较长。
No Time Slicing 完全禁用时间切片操作,因此每次探针更新都在一个帧内进行。这样确保了反射与周围对象的外观精确同步,但是处理成本可能过高。
与其他优化一样,您应该考虑在反射不太重要的位置使用质量较低的选项,而在能注意到细节的位置保留 No Time Slicing 选项。
5.6 版更新
2017–06–06 页面已发布
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.