我有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。
答案 0 :(得分:3)
我认为这可能是因为GPU只存储原始图像,
嗯,当然它们是原始格式。虽然GPU可以直接支持Deflate和JPEG解压缩,但它们不支持它。
有没有办法收紧内存使用?
您可以使用压缩纹理格式。是的,现代GPU 做支持动态解压缩,但使用的编解码器与PNG或JPEG非常不同。
我使用framebuffer对象加载纹理,该对象只创建一次。
为什么呢? FBO用于其他事情。您可以直接从文件加载QImage而无需这样的代理。
答案 1 :(得分:0)
您需要实现剪裁。当然,这本身并不会阻止占用内存,因此如果图像落在视图范围内,则需要延迟加载图像。关于这一点的一篇不错的文章是here。
答案 2 :(得分:0)
您可以将它们转换为更压缩的格式,或者从磁盘延迟加载它们,但这就是它。