使用许多纹理贴图不利于缓存吗?


10

如果我有多个纹理(例如5个以上的贴图)绑定到同一个纹理单元,那么与仅具有2个或3个纹理的情​​况相比,它对缓存的工作效果是否更差?

Answers:


16

只需添加imallett的答案,就可以确定的是,增加对着色器中不同纹理数据的访问次数会增加对GPU缓存的压力,但是还有其他一些因素会显着影响效果。与CPU缓存一样,GPU中可能存在多层缓存,这也可能使事实变得复杂。纹理单位<= L0 <= L1 <= ..内存

避免别名->使用MIP映射

如果您的场景中的纹理数据很小,则是由于透视或简单缩放而导致的,并且您没有使用MIP映射,那么您将获得锯齿。这不仅会产生视觉人工制品;这很可能是性能问题。

一旦获得别名,对纹理的地址访问将变得不连贯,这不仅会最终破坏高速缓存,还会引入大量的DRAM“页面中断”(更正确地说,是行中断),这可能会造成很大的代价。MIP映射有助于减少不一致性。

纹理压缩

也许这是一个显而易见的选择,但是如果您可以将纹理压缩(例如DXTn | ETC * | PVRTC * | etc)的目标范围从8bpp降到2bpp,则可以通过以下方式大大提高内存带宽/缓存的有效性:系数从4倍提高到16倍。现在我不能说所有的GPU,但是某些纹理压缩方案(例如上面列出的那些)在硬件中是如此容易解码,以至于数据可以在整个缓存层次结构中保持压缩状态,而只能在纹理单元中进行解压缩,因此有效地增加了这些缓存的大小。

资料大小

显然,某些数据(例如在后续渲染中用作纹理数据的渲染目标)不能采用纹理压缩。只要有可能,请使用将完成此工作的最小像素格式,即,如果将使用32 / 16bpp(A)RGB,请不要使用4x32浮点格式!

稀疏访问

这在某种程度上与上面的别名示例有关,但是我们已经看到了创建大型渲染目标但只有很少采样的情况。高速缓存行很长,无论是在CPU还是GPU中,因此如果您在每个高速缓存行中仅使用一个像素,那将会浪费传输。

同样,WRT压缩纹理通过有效地在纹理像素的局部区域之间共享数据来实现压缩。如果您没有一致的访问权限,那么除了减少内存占用之外,压缩可能也无济于事。

相关纹理读取

缓存问题不是很多(嗯,除非计算的访问非常不连贯),但是不是由顶点提供的UV坐标直接定义的纹理访问可能比直接定义的纹理访问慢。

平铺/莫顿VS交错纹理

尽管我怀疑这些天大多数纹理将以平铺或类似Morton(又称为Twiddled / Swizzled)的顺序(或什至两者结合)存储,但某些纹理可能仍以扫描线顺序存储,这意味着纹理可能会导致大量的高速缓存未命中/页面中断。不幸的是,我真的不知道如何识别这种格式的特定格式。

(有关背景知识,请尝试Blinn的“纹理映射的真相。FWIW”,采取了进一步的措施,至少在某些早期PC硬件中使用了旋转顺序(即Morton顺序)纹理)。


8

答案取决于您的意思。现代硬件(例如具有无边界纹理的硬件)实际上并不在乎“绑定”多少个纹理。真正的问题是您使用了多少

纹理通常以缓存友好的方式存储数据(我相信是莫顿曲线)。如果使用更多的纹理,则将导致更多的缓存未命中,因为现在纹理相互竞争空间。

这实际上归结于著名的,古老的着色器编程启发式:纹理抽头很慢;不要使用太多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.