OpenGL纹理占用了太多内存

时间:2012-04-18 12:22:59

标签: c++ qt opengl

我有75 * 9 * 32张图片,PNG格式的硬盘总共64 MB。如果我加载每张128 * 256像素的图像,它会在RAM中占用高达1.5 GB的内存!我没有启用mipmapping。

我认为这可能是因为GPU只存储原始图像,有没有办法收紧内存使用?

我使用framebuffer对象加载纹理,该对象只创建一次。

我使用以下内容来加载纹理:

        QImage catchImage = catchFbo->toImage();
        QImage t = QGLWidget::convertToGLFormat(catchImage);

        glGenTextures( 1, &Item::texture[i] );
        glBindTexture( GL_TEXTURE_2D, Item::texture[i] );
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

编辑:GL_COMPRESSED_RGBA而不是GL_RGBA似乎有很大的不同。它现在使用500 MB。

3 个答案:

答案 0 :(得分:3)

  

我认为这可能是因为GPU只存储原始图像,

嗯,当然它们是原始格式。虽然GPU可以直接支持Deflate和JPEG解压缩,但它们不支持它。

  

有没有办法收紧内存使用?

您可以使用压缩纹理格式。是的,现代GPU 支持动态解压缩,但使用的编解码器与PNG或JPEG非常不同。

  

我使用framebuffer对象加载纹理,该对象只创建一次。

为什么呢? FBO用于其他事情。您可以直接从文件加载QImage而无需这样的代理。

答案 1 :(得分:0)

您需要实现剪裁。当然,这本身并不会阻止占用内存,因此如果图像落在视图范围内,则需要延迟加载图像。关于这一点的一篇不错的文章是here

答案 2 :(得分:0)

您可以将它们转换为更压缩的格式,或者从磁盘延迟加载它们,但这就是它。