Version: 2020.3
在 Shader Graph 中使用 Streaming 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
将纹理标记为"仅虚拟纹理"