2012-11-09 52 views
0

目前,我的應用程序加載紋理(〜200MB)減少RAM使用對於紋理

我加載紋理到一個字符緩衝區,將它傳遞給OpenGL的,然後殺死後使用大量的內存緩衝區。

看起來這個內存是由OpenGL使用的,OpenGL在內部進行自己的紋理管理。

我可以採取什麼措施來減少這種情況?

是否有可能阻止OpenGL在內部管理紋理?

回答

2

一個典型的解決方案是跟蹤您在相機某個位置或時間範圍內需要的紋理,並且只在需要時加載這些紋理(反對在加載應用程序時加載每個紋理)。你必須有一個「管理器」來控制glBindTexture指定的相應紋理編號的加載 - 卸載和邊界的綁定(例如,將字符串,紋理名稱和整數相關聯的容器)。

其他選項是降低您使用的紋理的整體質量/尺寸。

2

這似乎是這種內存使用的OpenGL,

在內部做了自己的紋理管理。

不,不是紋理管理。它只需要將數據保存在某個地方。在現代系統上,GPU由多個同時運行的進程共享。並不是所有的數據都可以適應快速的GPU內存。所以OpenGL實現必須能夠交換數據。 GPU快速內存不是存儲,它只是另一個緩存級別。就像系統內存緩存系統存儲一樣。

此外,GPU可能會崩潰,現代驅動程序會在原位重置它們,而用戶不會注意。爲此,他們還需要完整的數據副本。

是否有可能阻止OpenGL在內部管理紋理?

不,因爲這樣做或者是單調乏味,或者是破壞事情。但是你可以做的只是加載繪製給定場景時真正需要的紋理。

如果你仔細看看我關於OpenGL的着述,你會注意到多年來我告訴人們不要編寫像「initGL」函數這樣的愚蠢的東西。把所有東西都放入你的繪圖代碼無論如何,你會經歷一個繪圖調度階段(你必須對半透明的物體進行遠近排列,截錐體篩選等)。這使您有機會檢查您需要的紋理,並加載它們。你甚至可以走得很遠,只加載較低分辨率的mipmap級別,這樣當一個場景最初顯示的時候它的細節很少,並且可以在背景中加載更高分辨率的mipmap;這當然需要適當設置最小和最大的mip級別以設置爲紋理或採樣器參數。

+0

什麼是在文件加載時實現這種紋理流而不引起幀率問題的好方法?我目前只是在開始運行我的應用程序時加載所有紋理。 此外,我似乎還記得,直接x不會緩存紋理 – aCuria

+1

@aCuria:像素緩衝區對象允許映射與glTexImage2D(數據= 0)或glTexStorage分配的紋理存儲到進程地址空間。在幀準備階段,丟失的紋理將被分配和映射,然後紋理加載作業將排入次要線程的任務列表中。在加載高細節紋理時,主顯示線程可以僅渲染部分加載的紋理(在此期間某些對象可能看起來很暗淡)。例如CryEngine就採用了這種技術,在加載地圖之後增量紋理加載是明顯的。 – datenwolf