1

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

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

我正在使用仅创建一次的帧缓冲区对象加载纹理。

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

        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。

4

3 回答 3

3

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

好吧,它们当然是原始格式。尽管 GPU 可以直接支持 Deflate 和 JPEG 解压缩,但它们并不支持。

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

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

我正在使用仅创建一次的帧缓冲区对象加载纹理。

为什么?FBO 用于其他用途。您可以直接从文件中加载 QImage,而无需此类代理。

于 2012-04-18T12:31:22.090 回答
0

您可以将它们转换为更压缩的格式或从磁盘延迟加载它们,仅此而已。

于 2012-04-18T12:29:50.450 回答
0

您需要实现剪辑。当然,这本身并不能防止占用内存,所以当图像落在您的视图范围内时,您需要延迟加载图像。关于这方面的一篇不错的文章在这里

于 2012-04-18T12:27:18.583 回答