1

ユーザーが拡大縮小してパンできる世界地図を実装しようとしています。プログラムのメモリが不足するという問題が発生しています。

これが私の状況です:

0)C#とOpenGLでプログラムを書いています

1)19メガサイズの世界の詳細画像であるJPG画像をWebからダウンロードしました。各ピクセルの長さは24ビットです。

2)プログラムの初期化時に、実行時にこのイメージをタイルに切り刻みます。glGenTexture、glBindTexture、およびglTexImage2dを使用して、各タイルをOpenGLにフィードします。

3)描画ルーチンでは、タイルを1つずつ描画し、画面に表示されているかどうかに関係なく、すべてのタイルを描画しようとします(これは別の問題です)。

小さな画像の場合、すべてが正常に機能します。ただし、大きな画像の場合、JPGをビットマップにデコードして切り刻むと、プログラムのメモリフットプリントが1ギガバイト以上に爆発します。私はJPGが圧縮されており、.NET JpegBitmapDecoderオブジェクトが巨大な画像を解凍する仕事をしていることを知っています。これは、おそらく私を困らせる原因です。

私の質問は、このような状況で正確に何ができるかということです。C#デコードコードはメモリを爆破する最初の責任者であるため、タイルを作成してOpenGLにフィードする別の方法はありますか?代わりに(ビットマップを除いて)追求する必要がありますか?

4

2 に答える 2

1

もちろん、RAMをもっと購入する必要があります。

GPUに圧縮形式でテクスチャを保存できます。このページ(SC3T / DXTセクションも参照)を参照してください。必要に応じて、ビデオメモリの内外でテクスチャを交換することもできます。必要がない場合は、非圧縮データを保持しないでください。

于 2013-03-21T19:07:20.697 に答える
0

jpgをビットマップファイルにデコードし、ビットマップ上のストリームを使用して、ビュー内の関連するタイルデータ(またはメモリが処理できる限り)を非同期的にロードすることを検討します-たとえば、AndroidのGoogleマップに似ています。

私もこれを見ましたが、「ビットマップからのOOMは非常に疑わしいです。このクラスは、不正なパラメータなど、問題が発生した場合にのみメモリ例外をスローします。」

于 2013-03-21T19:00:10.447 に答える