降低纹理的RAM使用率

时间:2012-11-09 06:32:58

标签: opengl

目前,我的应用在加载纹理(~200Mb)

后使用了大量内存

我将纹理加载到char缓冲区,将其传递给OpenGL,然后终止缓冲区。

看起来这个内存是由OpenGL使用的,它在内部进行自己的纹理管理。

我可以采取哪些措施来减少这种情况?

是否可以阻止OpenGL在内部管理纹理?

2 个答案:

答案 0 :(得分:2)

一个典型的解决方案是跟踪您在相机或时间范围的给定位置需要哪些纹理,并且只在您需要时加载(相反在加载应用时加载每个纹理)。你必须有一个“管理器”来控制加载 - 卸载和绑定相应的纹理编号(例如,一个容器,它将字符串,纹理名称与整数相关联)由glBindTexture分配)

其他选项是降低您正在使用的纹理的整体质量/尺寸。

答案 1 :(得分:2)

  

OpenGL似乎使用了这个内存,

  

在内部进行自己的纹理管理。

不,不是纹理管理。它只需要将数据保存在某处。在现代系统中,GPU由几个同时运行的进程共享。并非所有数据都适合快速GPU内存。因此,OpenGL实现必须能够交换数据。 GPU快速内存不是存储,它只是另一个缓存级别。就像系统内存是用于系统存储的缓存一样。

GPU也可能会崩溃,现代驱动程序会在原位重置它们,用户不会注意到。为此,他们还需要完整的数据副本。

  

是否可以阻止OpenGL在内部管理纹理?

不,因为这要么做得很乏味,要么就是破坏事情。但是你可以做的只是加载你绘制给定场景时真正需要的纹理。

如果你看一下我关于OpenGL的着作,你会注意到多年来我告诉人们不要写出像“initGL”这样的傻事。将所有内容放入绘图代码中。无论如何,您将完成绘图调度阶段(您必须对远近对称的截头对象进行排序,截头剔除等)。这使您有机会检查所需的纹理,并加载它们。你甚至可以走得很远,只加载较低分辨率的mipmap级别,这样当最初显示一个场景时它的细节很少,并在后台加载更高分辨率的mipmap;这当然需要将最小和最大mip级别的适当设置设置为纹理或采样器参数。