平滑渲染1.2 GB纹理,1 GB GPU如何做到这一点?

时间:2011-09-05 12:10:45

标签: opengl textures gpu

我的目标是看看使用比物理GPU内存更多的纹理数据时会发生什么。我的第一次尝试是加载多达40个DDS纹理,导致内存占用率高于GPU内存。但是,我的场景仍会在9500 GT上以200+ fps渲染。

我的结论:GPU / OpenGL非常智能,只能将mipmap的某些部分保留在内存中。我认为在标准配置上应该不可能,但无论如何。

第二次尝试:禁用mip映射,这样GPU将始终必须从高分辨率纹理中进行采样。再一次,我在内存中加载了大约40个DDS纹理。我用gDEBugger验证了纹理内存的使用情况:1.2 GB。不过,我的场景渲染速度为200+ fps。

我唯一注意到的是,当用相机远视并再次在场景中居中时,会出现严重的延迟。好像只有这样它才能将纹理从主存储器传输到GPU。 (我启用了一些基本的视锥体剔除)

我的问题:发生了什么事?这个1 GB GPU如何设法从200 GB fps的1.2 GB纹理数据中进行采样?

2 个答案:

答案 0 :(得分:4)

OpenGL可以在绘制调用之间(而不仅仅是帧之间)在纹理内存中填充和填充纹理。只有当前绘图调用所需的那些实际上需要驻留在图形内存中,其他只能驻留在系统RAM中。它可能只使用纹理数据的一小部分来实现。它与任何缓存几乎相同 - 当你的CPU上只有MB缓存时,如何在GB数据上运行算法?

PCI-E总线也具有非常高的吞吐量,因此您并没有真正注意到驱动程序进行了分页。

如果您想验证这一点,glAreTexturesResident可能会或可能没有帮助,具体取决于驱动程序的实施情况。

答案 1 :(得分:2)

即使您在测试中强制纹理颠簸(每帧丢弃并将一些纹理从系统内存上传到GPU内存),我也不确定,现代GPU和PCI-E有如此巨大的带宽一些颠簸确实会影响性能。其中一款9500GT机型的带宽为25.6 GB / s,16x PCI-E插槽(500 MB / s x 16 = 8 GB / s)是标准配置。

至于延迟,我会假设当你没有绘制可见纹理时GPU + CPU降低其功耗,当你突然超载它们时,它们需要一个短暂的瞬间启动。在现实生活中的应用程序和游戏中,这种0%-100%的突然工作负载变化从未发生过,因此我认为稍微滞后是完全可以理解和预期的。