我有 75 * 9 * 32 张图像,PNG 格式的硬盘驱动器总共有 64 MB。如果我加载每张 128*256 像素的图像,它会在 RAM 中占用高达 1.5 GB 的内存!我没有启用 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。
最佳答案
I am figuring this could be because the GPU only stores raw images,
当然,它们是原始格式。尽管 GPU 直接支持 Deflate 和 JPEG 解压缩会很好,但它们不支持。
is there a way to tighten the memory usage?
您可以使用压缩纹理格式。是的,现代 GPU 确实支持即时解压缩,但使用的编解码器与 PNG 或 JPEG 有很大不同。
I am loading the textures with the use of a framebuffer object, which is created only once.
为什么? FBO 用于其他用途。您可以直接从文件加载 QImage 而无需此类代理。
关于c++ - OpenGL 纹理占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209290/