[英]OpenGL textures taking up too much memory
我有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。
我想這可能是因為GPU僅存儲原始圖像,
好吧,它們當然是原始格式。 雖然直接支持Deflate和JPEG解壓縮對於GPU來說很簡潔,但它們不支持它。
有沒有辦法收緊內存使用?
您可以使用壓縮的紋理格式。 是的,現代GPU 確實支持即時解壓縮,但是所使用的編解碼器與PNG或JPEG完全不同。
我正在使用僅創建一次的幀緩沖對象加載紋理。
為什么? FBO用於其他目的。 您可以直接從文件加載QImage,而無需使用此類代理。
您需要實現裁剪。 當然,這本身並不能防止占用內存,因此,當圖像落在視圖范圍內時,您需要延遲加載圖像。 關於這方面的一篇體面文章在這里 。
您可以將它們轉換為更壓縮的格式,或者從磁盤延遲加載它們,僅此而已。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.