簡體   English   中英

OpenGL紋理占用過多內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM