2012-01-08 12 views
1

数十のテクスチャを読み込むと、アプリが予告なくクラッシュすることに気付きました。それは単に電話の前の画面に戻ります。携帯電話でメモリにそれほど多くのデータを保存できないためかもしれませんか?ゲームが始まる前にすべてのテクスチャを読み込まないといけませんか?数十のテクスチャをロードした後にアプリケーションがクラッシュする

+2

あなたのテクスチャのサイズ、その数、コードを抜粋して報告してください:) このように、私の車は始動しませんでした。問題は何ですか? :) :) –

+0

また、クラッシュログを掲載します – nandeesh

+0

テクスチャの合計サイズは3.2MBで、画像あたり平均100kbです。合計27個のPNGがあり、解像度は1024 x 1024です。 –

答えて

2

あなたは、コメントの一部として、すでにあなたの答えを得たが、私はここにこの結論を書きます:

彼らはおそらく圧縮されているような記憶であなたの資産の大きさは、重要ではありません。重要なことは、実際の作業セットのサイズです。画像の場合では、1024×1024、4チャンネル(RGBA)、単一のテクスチャのあなたのワーキングセットのサイズ、チャネルあたり1バイトの場合

width * height * sizeof(pixel) 

sizeof(pixel) = sum[channels]{ sizeof(channel) } 

としてそれを計算することができますでしょう次のようになります。

1024*1024 = 1Mi 
1Mi * 4 * 1B = 4MiB 

27テクスチャの場合、これは27*4MiB = 108MiBになります。現在OpenGLは、抽象的なマシンの観点から定義されています。つまり、あなたがそれを聞くことはできません。それはメモリが不足しているかどうかを伝えるだけです。すべてがビデオRAMに収まらない場合、OpenGLは通常のシステムRAMを使用することもあります。いずれにしても、ハンドヘルドデバイスでは、100MiBを超えるテクスチャデータをアップロードしようとするとメモリが不足する可能性があります。

ゲームを開始する前にすべてのテクスチャを読み込まないのはどうですか?

いいえ、すべきではありません。実際には、ゲームのコンテンツを「ストリーミング」し、必要に応じてロードするほうが良いです。また、何らかのガベージコレクションやリサイクルのスキームが大いに役立ちます。テクスチャの割り当ては高価です(glTexImageへの呼び出し)が、データの置換は安い(glTexSubImage)ので、テクスチャ管理構造に "未使用"カウンタを追加することをお勧めします。テクスチャをバインドして描画するたびに、ゼロに設定します。フレームの終了後、各テクスチャオブジェクトの「未使用」カウンタをインクリメントする。新しいテクスチャをロードする必要がある場合は、すべてのテクスチャオブジェクトを繰り返し、未使用のカウンタでソートされたフォーマット(同じサイズとチャンネル数)を持つものを選択し、テクスチャオブジェクトを "未使用"値の中央値で再利用しますすなわち、「未使用」のソートされたセットの真ん中にある。すべての「未使用」のテクスチャは解放され、他のテクスチャは予備として残ります。複数のテクスチャを割り当てる必要がある場合は、最初にN個のメジアンオブジェクトから割り当てます。この戦略を使用すると、テクスチャオブジェクトをすぐに使用できるようになります。また、未使用のメモリを解放することもあります。

1

コメントを要約すると、RGBAモードで1024×1024ピクセルの合計27個のテクスチャを割り当てて、テクスチャごとに4 MBのビデオRAMを割り当て、合計110 MBにします。

このようなクラッシュを避け、複数のAndroidシステムと互換性があるようにするには、テクスチャのサイズを小さくする必要があります(全体的な品質が低下することがあります)。

テクスチャは、他の新しい読み込みのためのスペースを作るためにもう使用されていなければアンロードする必要があると言うのは無駄です。

関連する問題