目前,我的应用在加载纹理后使用了大量内存(~200Mb)
我将纹理加载到 char 缓冲区中,将其传递给 OpenGL,然后终止缓冲区。
看起来这个内存是由 OpenGL 使用的,它在内部进行自己的纹理管理。
我可以采取什么措施来减少这种情况?
是否可以阻止 OpenGL 在内部管理纹理?
目前,我的应用在加载纹理后使用了大量内存(~200Mb)
我将纹理加载到 char 缓冲区中,将其传递给 OpenGL,然后终止缓冲区。
看起来这个内存是由 OpenGL 使用的,它在内部进行自己的纹理管理。
我可以采取什么措施来减少这种情况?
是否可以阻止 OpenGL 在内部管理纹理?
一种典型的解决方案是在相机的给定位置或时间范围内跟踪您需要哪些纹理,并仅在需要时加载那些纹理(而不是在加载应用程序时加载每个纹理)。您将必须有一个“管理器”,它控制由 glBindTexture 分配的相应纹理编号(例如,将字符串、纹理名称与整数相关联的容器)的加载-卸载和边界)
其他选项是降低您正在使用的纹理的整体质量/大小。
OpenGL似乎使用了这个内存,
是的
它在内部进行自己的纹理管理。
不,不是纹理管理。它只需要将数据保存在某个地方。在现代系统中,GPU 由同时运行的多个进程共享。并非所有数据都适合快速 GPU 内存。所以OpenGL实现必须能够交换数据。GPU 快速内存不是存储,它只是另一个缓存级别。就像系统内存是系统存储的缓存一样。
此外,GPU 可能会崩溃,并且现代驱动程序会在用户没有注意到的情况下将它们原位重置。为此,他们还需要数据的完整副本。
是否可以阻止 OpenGL 在内部管理纹理?
不,因为这样做要么很乏味,要么会破坏事情。但是你可以做的是只加载绘制给定场景真正需要的纹理。
如果您阅读我关于 OpenGL 的文章,您会注意到多年来我一直告诉人们不要编写诸如“initGL”函数之类的愚蠢的东西。将所有内容放入您的绘图代码中。无论如何,您将经历一个绘图调度阶段(您必须对半透明对象进行远近排序、截锥体剔除等)。这使您有机会检查所需的纹理并加载它们。您甚至可以只加载较低分辨率的 mipmap 级别,以便在最初显示场景时其细节较少,并在背景中加载较高分辨率的 mipmap;这当然需要适当设置最小和最大 mip 级别,以将其设置为纹理或采样器参数。