Andengine ゲーム用にサイズが 9000*30 の大きな tmx マップがあり、それをアプリケーションにロードしようとすると、outOfMemory エラーが発生します。誰でもこの問題を解決できますか? 何か案が?
2 に答える
よくわかりません。これを AndroidManifest.xml に入れてみてください
<Application
android:largeHeap="true"
...
Andengineは、設計によりテクスチャをメモリに自動的に割り当てます。エンジンによって OOM エラーがスローされた場合は、おそらく何か間違ったことを行っているか、少なくとも設計上推奨されていないため、別の方法を再検討する必要があります。
あなたの場合、tmx マップをいくつかの異なるファイルに分割し、それらScene
をバッチとしてロードする必要があります。
そうすれば、同じ数のタイルを複数の異なるメモリ領域に割り当てることができます。メモリ領域ははるかに小さくなり、ハイエンド デバイスだけでなく、より多くのデバイスでサポートされます。
ただし、1 つの大きな tmx マップをメモリにマップする必要がある場合は、Andengine で次のように変更する必要があります。
org/andengine/entity/sprite/batch/SpriteBatch.javaを置き換えます:
public SpriteBatch(final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) {
this(pTexture, pCapacity, new HighPerformanceSpriteBatchVertexBufferObject(pVertexBufferObjectManager, pCapacity * SpriteBatch.SPRITE_SIZE, pDrawType, true, SpriteBatch.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT));
}
と:
public SpriteBatch(final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) {
this(pTexture, pCapacity, new LowMemorySpriteBatchVertexBufferObject(pVertexBufferObjectManager, pCapacity * SpriteBatch.SPRITE_SIZE, pDrawType, true, SpriteBatch.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT));
}
ただし、これを使用すると、デバイスのハードウェアの制限に直接依存していることに注意してください。
編集:
私は次のようなものを提案します:
最初に、初期マップをロードし (常に 1 のみを考慮TMXLayer
)、次のようにアタッチしますScene
。
TMXLoader tmxLoader;
try {
tmxLoader = new TMXLoader(this.getAssets(), this.mEngine.getTextureManager(), TextureOptions.BILINEAR_PREMULTIPLYALPHA, this.getVertexBufferObjectManager(), new ITMXTilePropertiesListener() {
@Override
public void onTMXTileWithPropertiesCreated(final TMXTiledMap pTMXTiledMap, final TMXLayer pTMXLayer, final TMXTile pTMXTile, final TMXProperties<TMXTileProperty> pTMXTileProperties) {
}
});
this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/map1.tmx");
} catch (final TMXLoadException e) {
Debug.e(e);
}
final TMXLayer tmxLayer = this.mTMXTiledMap.getTMXLayers().get(0);
scene.attachChild(tmxLayer);
次に、ゲームが横スクロール指向であると仮定すると ( の幅が大きいためScene
)、ユーザーが現在の tmx の最後 (最後の列のタイルのいずれか) または反対側のエッジに到達しようとするたびに、スワップします。たとえば、次のようなものです。
あなたが実行しますthis.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/" + fileName);
そしてchangeTmxMap(this.mTMXTiledMap);
。
これは次のようなものです:
private void changeTmxMap(TMXTiledMap mTMXTiledMap){
final TMXLayer tmxLayer = this.mTMXTiledMap.getTMXLayers().get(0);
scene.attachChild(tmxLayer);
}