私はアンドロイドゲームに取り組んでいます。背景に 3 つの画像を使用しようとすると、問題が発生します。画像は 1280x720px で 100kb です。画像は実際にはそれほど大きくないので、なぜメモリの問題が発生するのか少し混乱しています。
注: 画面の解像度は 800x400 であるため、Android 開発者で推奨されているように、画像を 2 倍にサイズ変更することはできません 注: 私は HTC 欲望の電話を使用しています (ここでクラッシュが発生します)。それは正常に動作します。
DDMS でメモリを分析したところ、ヒープのサイズが 3.5 MB しかないことがわかりました。rt.MaxMemory() をチェックすると、アプリごとに約 25 MB のスペースがあると表示されます。
私の頭に浮かぶのは、ヒープがより大きな写真/アプリに対応するのに十分な速さで「更新」されていないため、非常に小さいにもかかわらず、画像をロードする前にクラッシュすることです. ヒープサイズを手動で設定する方法はありますか、または少なくとも拡大するように指示する方法はありますか?
画像をロードするコードは次のとおりです。
Bitmap floorFront = BitmapFactory.decodeResource(host.getResources(), R.drawable.floor1);
floorFront = Bitmap.createScaledBitmap(floorFront,host.realWidth,host.realHeight, true);
floorFront = Bitmap.createBitmap(floorFront, 0, host.realHeight/2, host.realWidth, host.realHeight/2);
host.addInstance(new Background(0,host.realHeight/2,host,floorFront,1));
Bitmap floorBack = BitmapFactory.decodeResource(host.getResources(), R.drawable.sand);
floorBack = Bitmap.createScaledBitmap(floorBack,host.realWidth,host.realHeight, true);
floorBack = Bitmap.createBitmap(floorBack, 0, host.realHeight/2, host.realWidth, host.realHeight/2);
host.addInstance(new Background(0,host.realHeight/2,host,floorBack,4));
Bitmap floorRock = BitmapFactory.decodeResource(host.getResources(), R.drawable.foreground);
floorRock = Bitmap.createScaledBitmap(floorRock,host.realWidth,host.realHeight, true);
floorRock = Bitmap.createBitmap(floorRock, 0, host.realHeight/2, host.realWidth, host.realHeight/2);
host.addInstance(new Background(0,host.realHeight/2,host,floorRock,0));
LogCat からの正確なエラーは次のとおりです。
maxMemory:25165824
memoryClass:24
6144000-byte external allocation too large for tgis process.
Out of memory: Heap Size=4739KB, Allocated=2399KB, Bitmap Size=18668KB
VM won't let use allocate 6144000bytes
編集:ビットマップが「生の」サイズの画像を使用し、圧縮されていないことは理にかなっていると言いました。そして、いくつかの調査の後、Android 2.2および2.3ではビットマップがヒープに保存されていないため、画像がロードされた後にヒープが増加しないようです。
もう 1 つ質問があります。この 3 枚の画像を背景に使用します。垂直方向に少しサイズを変更しますが、水平方向にはまだ必要です。したがって、画像はまだ約 100x720px です。3 つの画像が必要な理由は、それらを別々に描画してレイヤー効果を得ることができるためです (2 つの画像の間に何かを描画できます)。使用するメモリをできるだけ少なくして望ましい効果を得るためにこれを実装する最良の方法は何でしょうか?
背景: 中: 前景
注: これは静的な背景にすぎません。アニメーションは背景と背景の間で発生します。