由于诸多原因,渲染反射探针的立方体贴图需要大量的处理器时间:
必须使用探针原点处的“摄像机”单独渲染立方体贴图六个面中的每一面。
对于反射的每个反弹级别,探针都需要单独的时间进行渲染(请参阅高级反射探针的文档以了解更多详细信息)。
立方体贴图的各种 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 页面已发布