OpenGL 大 3D 纹理 (>2GB) 非常慢
OpenGL big 3D texture (>2GB) is very slow
我的显卡是GTX 1080 ti。我想使用 OpenGL 3D 纹理。像素(体素)格式为 GL_R32F。当我初始化纹理并用纹理渲染时,OpenGL 没有报任何错误。
当 3D 纹理很小 (512x512x512) 时,我的程序 运行 很快 (~500FPS)。
但是,如果我将大小增加到 1024x1024x1024 (4GB),FPS 会急剧下降到不到 1FPS。当我监控GPU内存使用时,即使纹理大小为4GB,GPU内存也没有超过3GB,而我总共有11G。
如果我将像素格式更改为 GL_R16F,它再次起作用,FPS 恢复到 500FPS,GPU 内存消耗约为 6.2GB。
我的假设是 4GB 3D 纹理实际上并不在 GPU 上,而是在 CPU 内存上。在每一帧中,驱动程序一次又一次地将此数据从 CPU 内存传递到 GPU 内存。结果,它降低了性能。
我的第一个问题是我的假设是否正确?如果是,为什么即使我有足够的 GPU 内存也会发生?我如何强制任何 OpenGL 数据驻留在 GPU 内存中?
My first question is whether my hypothesis is correct?
至少不是不可信。
If it is, why it happens even I have plenty of GPU memory?
这取决于您的 OpenGL 实现。请注意,这也 可能 是一些驱动程序错误。这也可能是一些内部限制。
How do I enforce any OpenGL data to reside on GPU memory?
你不能。 OpenGL 没有视频 RAM 或系统 RAM 甚至 GPU 的概念。您指定缓冲区和纹理以及其他对象并进行绘制调用,GL 实现的工作是将其映射到实际硬件。但是,没有任何性能保证 - 当您做某些事情时,您可能会遇到缓慢的路径甚至回退到软件渲染(后者在最近确实不常见,但从概念上讲,这是很有可能的)。
如果您想控制放置数据的位置、实际传输数据的时间等等,您必须使用更底层的 API,例如 Vulkan。
我的显卡是GTX 1080 ti。我想使用 OpenGL 3D 纹理。像素(体素)格式为 GL_R32F。当我初始化纹理并用纹理渲染时,OpenGL 没有报任何错误。
当 3D 纹理很小 (512x512x512) 时,我的程序 运行 很快 (~500FPS)。
但是,如果我将大小增加到 1024x1024x1024 (4GB),FPS 会急剧下降到不到 1FPS。当我监控GPU内存使用时,即使纹理大小为4GB,GPU内存也没有超过3GB,而我总共有11G。
如果我将像素格式更改为 GL_R16F,它再次起作用,FPS 恢复到 500FPS,GPU 内存消耗约为 6.2GB。
我的假设是 4GB 3D 纹理实际上并不在 GPU 上,而是在 CPU 内存上。在每一帧中,驱动程序一次又一次地将此数据从 CPU 内存传递到 GPU 内存。结果,它降低了性能。
我的第一个问题是我的假设是否正确?如果是,为什么即使我有足够的 GPU 内存也会发生?我如何强制任何 OpenGL 数据驻留在 GPU 内存中?
My first question is whether my hypothesis is correct?
至少不是不可信。
If it is, why it happens even I have plenty of GPU memory?
这取决于您的 OpenGL 实现。请注意,这也 可能 是一些驱动程序错误。这也可能是一些内部限制。
How do I enforce any OpenGL data to reside on GPU memory?
你不能。 OpenGL 没有视频 RAM 或系统 RAM 甚至 GPU 的概念。您指定缓冲区和纹理以及其他对象并进行绘制调用,GL 实现的工作是将其映射到实际硬件。但是,没有任何性能保证 - 当您做某些事情时,您可能会遇到缓慢的路径甚至回退到软件渲染(后者在最近确实不常见,但从概念上讲,这是很有可能的)。
如果您想控制放置数据的位置、实际传输数据的时间等等,您必须使用更底层的 API,例如 Vulkan。