0

デバイスで人の動きをアニメーション化しようとしています。最終的に1.23Mbになるスプライトシートを作成しました。画像のサイズは 5000 x 1500 ピクセルです。シートには 8 つの行があり、それぞれが独自のアクションです。(歩いて、お辞儀をして、ジャンプして…)。最長のアクションは 32 枚の画像です。したがって、画像は基本的に 32 列 x 8 行です。だから、今私はそれをロードします:

これを行うとすぐに:

private Bitmap bmp;
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.myImage);

エラーが発生します:

スレッド [<1> main] (中断 (例外 OutOfMemoryError))
BitmapFactory.decodeResource(Resources, int, BitmapFactory$Options) 行: 385 BitmapFactory.decodeResource(Resources, int) 行: 404
GameView.(Context) 行: 25 FightActivity. onCreate(Bundle) 行: 13 FightActivity(Activity).performCreate(Bundle) 行: 4465
Instrumentation.callActivityOnCreate(Activity, Bundle) 行: 1049
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行: 1920
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord , Intent) 行: 1981 ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) 行: 123
ActivityThread$H.handleMessage(Message) 行: 1147
ActivityThread$H(Handler).dispatchMessage(Message) 行: 99 Looper.loop() 行: 137 ActivityThread.main(String[]) 行: 4424
Method.invokeNative(Object, Object[]、Class、Class[]、Class、int、boolean) 行: 利用不可 [ネイティブ メソッド] Method.invoke(Object, Object...) 行: 511 ZygoteInit$MethodAndArgsCaller.run() 行: 784
ZygoteInit. main(String[]) 行: 551 NativeStart.main(String[]) 行: 利用不可 [ネイティブメソッド]

特定のファイルサイズに制限されていますか? 奇妙に思えますか?もしそうなら、1 つの大きなスプライト シートの行ごとに一連のアクション イメージとは対照的に、スプライトを個別の「アクション」イメージに分割する唯一のオプションはありますか?

誰かが初心者を助けてくれることを願っています。

4

4 に答える 4

1

簡単な計算で答えが得られます。ピクセルあたり32ビットを想定すると、((5000x1500)ピクセル)*(32ビット/ピクセル)/(8ビット/バイト)/(1024 *1024ビット/Mb)=28MBになります。

Googleで検索したところ、Androidのさまざまなバージョンと16MBから32MBの範囲のさまざまな携帯電話のデフォルトのヒープサイズが表示されています。私は24MBが最も一般的だと思います。したがって、画像のメモリが不足している可能性が非常に高くなります。この投稿をチェックして、ヒープサイズを確認してください:https ://stackoverflow.com/a/9428660/1448071 。

編集: AndroidのVMヒープサイズを増やす良い方法はないようです。ここで説明されているsetMinimumHeapSize関数を持つVMRuntime.getRuntime()関数がありますAndroid:実行時にヒープサイズを増やす方法は?。しかし、それは非推奨になっているようです。スプライトを分割することをお勧めします。

于 2012-07-29T03:37:20.997 に答える
1

キャラクターのアニメーションごとに 1 つのスプライトシートを用意し、一般的なものへの参照を保持し、必要に応じてロードします。これは十分に柔軟性があり、メモリからロードする必要がある場合のビットマップの変更を除いて、アニメーションが遅れることはありません。長い記憶)。

VM ヒープ サイズを増やすことは部分的な解決策にすぎず、非常に大きなビットマップを保持している場合、多くのデバイスでは必要なヒープ サイズが得られません。上で述べたように、ディスク上の画像ファイル サイズは、アプリケーションを Google Play にデプロイする場合にのみ重要です (ユーザーがダウンロードする量は少なくなります) が、RAM では画像は完全に未加工です。まったく同じ色深度を持つ、完全にカラフルなものと同じスペースをアップします)。

この素晴らしいソフトウェアを使用するソリューションを提案します (私は自分で使用し、それが素晴らしいことを除いて、私はそれに所属していません)、すぐにスプライトシートを作成し、さまざまな形式で座標をエクスポートします使用する。テクスチャパッカー.

于 2012-07-29T20:09:07.960 に答える
0

VMヒープサイズを増やす必要があります。私はあなたのためにリンクを取得したいのですが、これは私ができる最高のことだと思いますatm- Javaでヒープサイズを増やします

于 2012-07-29T03:48:12.883 に答える
0

画像の複雑さによっては、別の解決策としてベクター グラフィックスを使用することがあります。さまざまなレベルのドキュメントとライセンス要件を持つ多数のライブラリがあります。

例; http://www.andengine.org/

https://play.google.com/store/apps/details?id=org.anddev.farmtower.eco (このゲームで使用されている AndEngine)

于 2012-07-29T04:03:10.437 に答える