2013-03-21 115 views
1

我正試圖實現用戶可以縮放和平移的世界地圖。我遇到了一個問題,即我的程序內存不足。OpenGL將圖像拼貼到紋理中並耗盡內存

這裏是我的情況:

0)我在C#和OpenGL

1)寫我的節目,我下載下來是這樣的世界是在19兆的詳細圖像的網頁JPG圖片尺寸。每個像素是24位長。

2)當我的程序初始化時,我在運行時將這張圖像切成瓦片。我使用glGenTexture,glBindTexture和glTexImage2d將每個圖塊輸入到OpenGL中。 3)在我的繪圖程序中,我逐一繪製圖塊,並儘量繪製所有圖塊,而不管它們是否在屏幕上(這是我知道的另一個問題)。

對於一個小圖像,一切工作正常。但是,對於大圖像,當我將JPG解碼爲位圖以便將其切分時,我的程序內存佔用空間會突然超過千兆字節。我知道JPG被壓縮,.NET JpegBitmapDecoder對象正在解壓縮一個巨大的圖像,這可能會讓我陷入麻煩。

我的問題是,在這種情況下究竟能做什麼?由於C#解碼代碼是爆炸內存的第一責任方,是否有另一種方法創建切片並將其送入OpenGL,而我應該追求(減去位圖)?

+1

代替JPEG,請使用您的視頻卡已用於壓縮紋理的相同壓縮格式。 – 2013-03-21 19:01:42

回答

0

我會研究將jpg解碼爲位圖文件並使用位圖上的流異步加載視圖中的相關圖塊數據(或與內存可處理的數量相同) - 類似於Android上的Google地圖。

我也看到了這一點,但不能確認"OOM from a Bitmap is very suspect. This class will throw the memory exception for just about anything that goes wrong, including bad parameters etc."

+0

流做到了。最初我是從流中複製整個圖像到一個字節數組,然後使用字節數組而不是流。我改變它只是爲了使用流,這是一個很大的區別。 – 2013-03-23 13:43:05

1

顯然你應該買更多的內存!

您可以在GPU上以壓縮格式存儲紋理。請參閱this page(也是SC3T/DXT部分)。您可能還需要根據需要交換視頻內存和內存中的紋理。如果你不需要它,不要保留未壓縮的數據。