Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 平滑渲染1.2GB纹理,1GB GPU如何做到这一点?_Opengl_Textures_Gpu - Fatal编程技术网

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

Opengl 平滑渲染1.2GB纹理,1GB GPU如何做到这一点?,opengl,textures,gpu,Opengl,Textures,Gpu,我的目标是看看当使用比物理GPU内存中更多的纹理数据时会发生什么。我的第一次尝试是加载多达40个DDS纹理,导致内存占用比GPU内存要高。但是,在9500 GT上,我的场景仍将以200+fps的速度渲染 我的结论是:GPU/OpenGL是智能的,只在内存中保留了mipmap的某些部分。我认为这在标准配置上是不可能的,但无论如何 第二次尝试:禁用mip映射,这样GPU将始终必须从高分辨率纹理采样。再一次,我在内存中加载了大约40个DDS纹理。我用gDEBugger:1.2GB验证了纹理内存的使用情

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

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

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

我注意到的唯一一件事是,当把相机移开,然后再次将其置于场景中心时,会出现严重的延迟。似乎只有这样它才能将纹理从主内存传输到GPU。(我启用了一些基本的截锥剔除功能)


我的问题是:发生了什么?这个1GB GPU是如何以200+fps的速度从1.2GB的纹理数据中采样的?

OpenGL可以在绘制调用之间(不仅仅是在帧之间)将完整的纹理分页到纹理内存中或从纹理内存中分页。只有当前draw调用所需的那些实际上需要驻留在图形内存中,其他的只能驻留在系统RAM中。它可能只对纹理数据的一小部分执行此操作。这与任何缓存都差不多——当CPU上只有MB的缓存时,如何在GBs的数据上运行算法

此外,PCI-E总线具有非常高的吞吐量,因此您不会真正注意到驱动程序执行分页


如果您想验证这一点,
眩光纹理Resident
可能会有帮助,也可能不会有帮助,这取决于驱动程序的实现情况。

即使您在测试中强制进行纹理抖动(丢弃某些纹理并将其从系统内存每帧上载到GPU内存),但我不确定您是否做到了,现代GPU和PCI-E拥有如此巨大的带宽,以至于某些抖动确实会对性能产生如此大的影响。其中一款9500GT型号的带宽为25.6 GB/s,16个PCI-E插槽(500 MB/s x 16=8 GB/s)是标准配置


至于延迟,我假设当你不绘制可见纹理时,GPU+CPU会降低它们的功耗,当你突然使它们过载时,它们需要一个短暂的瞬间通电。在现实生活中的应用程序和游戏中,这种0%-100%的突然工作负载变化是不会发生的,所以我想,轻微的延迟是完全可以理解和预期的。

也许部分纹理在GPU内存中,部分纹理在RAM中?也许CPU和GPU之间有共享内存?也许PCI express就是这么快?听起来很有道理。一个有用的测试是加载更多的纹理,在PCI-E总线上加载一个合适的负载。我在更改视点时所经历的延迟,是否与OpenGL的愚蠢和过早释放过多纹理内存有关?情况是:40个可见纹理(平滑),没有可见纹理(平滑),40个可见纹理(1个很长的帧,之后平滑)。这只是猜测。可能有缓存替换策略会导致这种情况,是的-例如,“未经培训”的缓存可能默认为类似于LRU的配置,如果您只是在数据中循环,这是最糟糕的配置。如果你想知道答案,你必须与你的硬件/驱动程序制造商联系-不同的配置可能会给你完全不同的效果。另一方面,对于1.2gb的纹理数据,每帧至少需要重新加载200 mb。在200FPS时,这意味着200x200 mb/s将使所有现有的PCI-E总线达到最大。编辑:事实上,这正是我刚刚意识到的。无论如何,我会做更多的测试。感谢您的帮助。分页可能比单个页面更细粒度。我希望更新的驱动程序/卡可以做到这一点,尤其是w.r.t.GPU任务。在缩小的情况下,某些页面可能永远不会被点击,因此它们不会被分页,实际上减少了GPU使用的内存量。