数十のテクスチャを読み込むと、アプリが予告なくクラッシュすることに気付きました。それは単に電話の前の画面に戻ります。携帯電話でメモリにそれほど多くのデータを保存できないためかもしれませんか?ゲームが始まる前にすべてのテクスチャを読み込まないといけませんか?数十のテクスチャをロードした後にアプリケーションがクラッシュする
答えて
あなたは、コメントの一部として、すでにあなたの答えを得たが、私はここにこの結論を書きます:
彼らはおそらく圧縮されているような記憶であなたの資産の大きさは、重要ではありません。重要なことは、実際の作業セットのサイズです。画像の場合では、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個のメジアンオブジェクトから割り当てます。この戦略を使用すると、テクスチャオブジェクトをすぐに使用できるようになります。また、未使用のメモリを解放することもあります。
コメントを要約すると、RGBAモードで1024×1024ピクセルの合計27個のテクスチャを割り当てて、テクスチャごとに4 MBのビデオRAMを割り当て、合計110 MBにします。
このようなクラッシュを避け、複数のAndroidシステムと互換性があるようにするには、テクスチャのサイズを小さくする必要があります(全体的な品質が低下することがあります)。
テクスチャは、他の新しい読み込みのためのスペースを作るためにもう使用されていなければアンロードする必要があると言うのは無駄です。
- 1. イメージをロードした後にアプリケーションがクラッシュする
- 2. コンソールWebアプリケーションから起動した後にアプリケーションがクラッシュする
- 3. AndroidアプリケーションでgetWritableDatabase()を実行した後でアプリケーションがクラッシュする
- 4. ジェスチャーUITapGestureRecognizerをUILabelに追加した後にアプリケーションがクラッシュする
- 5. SQLデータベースにデータを挿入した後にアプリケーションがクラッシュする
- 6. アプリケーションを設定に切り替えた後、アプリケーションがクラッシュする
- 7. AppStoreのアップグレード後にアプリケーションがクラッシュする
- 8. insertRowsAtIndexPathsの後にアプリケーションがクラッシュする
- 9. iOS 4.2をインストールした後にアプリケーションがクラッシュする
- 10. EventHandlerを追加した後にGTK#アプリケーションがクラッシュする
- 11. 反応ネイティブチャートアンドロイドを使用した後にアプリケーションがクラッシュする
- 12. Android Studioでナビゲーションメニューを追加した後にアプリケーションがクラッシュする
- 13. ボタンをクリックした後にアプリケーションがクラッシュする
- 14. 構造を変更した後にアプリケーションがクラッシュする
- 15. Laravel 5.2データベースに追加した後にアプリケーションがクラッシュする
- 16. Android:閉じると再開した後にアプリケーションがクラッシュする
- 17. NSPredicateの後でテーブルビューのデータをリロードした後にアプリケーションがクラッシュする
- 18. PIXI.jsにテクスチャを複数回ロードする
- 19. 新しいオブジェクトを宣言した後、Qtアプリケーションがクラッシュする
- 20. iPadでアップデートした後にアプリケーションがクラッシュする
- 21. 更新後にアプリケーションがクラッシュする
- 22. 公開後にWPFアプリケーションがクラッシュする
- 23. 4分後にアプリケーションがクラッシュする
- 24. 別のコンピュータにプロジェクトをロードした後にAndroidアプリがクラッシュする
- 25. 新しいバージョンへのアップデート後にiOSのアプリケーションがクラッシュした
- 26. GL_RGBテクスチャをロードした後の変なカラーシフト
- 27. onSaveInstanceStateをオーバーライドした後もアプリケーションがクラッシュする
- 28. Xamarin Android:設定でクリアデータの後にアプリケーションがクラッシュしました
- 29. WebRequestHandlerのためにAzureにデプロイした後にWebアプリケーションがクラッシュする
- 30. アプリが閉鎖された後にアプリケーションがクラッシュする
あなたのテクスチャのサイズ、その数、コードを抜粋して報告してください:) このように、私の車は始動しませんでした。問題は何ですか? :) :) –
また、クラッシュログを掲載します – nandeesh
テクスチャの合計サイズは3.2MBで、画像あたり平均100kbです。合計27個のPNGがあり、解像度は1024 x 1024です。 –