Version: Unity 6.0 (6000.0)
语言 : 中文
在 Shader Graph 中使用 Streaming Virtual Texturing
将纹理标记为"仅虚拟纹理"

虚拟纹理的缓存管理

此功能为实验性功能,尚未准备好用于生产环境。未来可能会对功能和文档进行更改或移除。

虚拟纹理 (Virtual Texturing) 系统在 GPU 内存中使用固定大小的纹理缓存。每种图形格式有一个缓存。您可以配置缓存的默认大小并重写其默认大小。

串流虚拟纹理(Streaming Virtual Texturing,SVT)系统还使用主内存中的一个 CPU 缓存来存储图块页面。一个图块页面包含多个图块,SVT 系统将这些图块一起从磁盘读取到 CPU 缓存中。这提高了在速度较慢的驱动器上从磁盘读取数据的吞吐量速度。当虚拟纹理系统请求一个图块时,它会读取包含该图块的页面。很有可能在接下来的帧中,系统会请求该页面中的其他图块,因此 CPU 缓存会保留该页面,以避免再次从磁盘读取数据。CPU 缓存越大,虚拟纹理系统将页面保留在主内存中的时间就越长。

如果材质具有一个纹理堆栈且该纹理堆栈具有使用给定图形格式的纹理,那么在渲染该材质时,虚拟纹理系统会为该格式分配 GPU 缓存。您可以配置 HDRP 资源上的缓存大小(以 MB 为单位),从而为每个质量级别实现不同的配置。

您还可以使用 VirtualTexturing.Streaming.SetGPUCacheSettings 方法在脚本中设置缓存大小。

你可以更改缓存大小,但这会导致大量占用 CPU 和 GPU 资源的操作,并且会阻塞主线程和渲染线程。更改缓存大小所需的时长取决于缓存的大小和数量。为避免出现明显的卡顿或画面不流畅现象,你应当在帧率不那么重要的时候(比如在加载关卡的时候)更改缓存大小。

影响特定缓存最佳大小的主要因素是输出屏幕的分辨率,以及每个纹理堆栈中使用该图形格式的层数。场景中材质的数量以及纹理的分辨率对最佳大小的影响没有那么大。对于设置为最高质量的全高清屏幕分辨率而言,总 GPU 缓存大小通常为 700MB。

当缓存的大小过小,不足以容纳其内容时,就会出现一种称为“缓存抖动”的问题,此时缓存必须在同一帧中加载和卸载图块。为防止缓存抖动,虚拟纹理系统会根据需要自动降低纹理质量。它会监控缓存的使用情况,并自动管理像素着色器中纹理堆栈采样的 Mipmap 偏差。如果缓存填满,则 Mipmap 偏差会增加。这确保了虚拟纹理系统请求较低分辨率的图块,从而节省了缓存空间,使其能够容纳所有请求的图块。

如果您的纹理看起来模糊,请尝试增加缓存的大小。如果缓存的大小已经足以以最高质量渲染帧,那么进一步增大缓存大小就意味着,缓存在逐出图块之前,能够更长时间地保留这些图块。这可以减少一些不必要的情况,例如移动或转动摄像机时出现的纹理突变,因为最近可见的图块更有可能仍在缓存中。

在 Shader Graph 中使用 Streaming Virtual Texturing
将纹理标记为"仅虚拟纹理"