我的 Andengine 游戏有一个很大的 tmx 地图,大小为 9000*30,当我想将它加载到应用程序中时,我收到了 outOfMemory 错误。谁能帮我解决这个问题?任何想法?
2 回答
我不确定,试着把它放在你的 AndroidManifest.xml
<Application
android:largeHeap="true"
...
Andengine通过设计自动将纹理分配到内存中。如果你得到引擎抛出的 OOM 错误,你可能做错了什么,或者至少是设计不鼓励,应该重新考虑替代方案。
在您的情况下,您应该将您的 tmx 映射分成几个不同的文件,并将它们加载到Scene
as 批次中。
这样,您可以将相同数量的图块分配到几个不同的内存区域,这些内存区域会小得多,因此得到更多设备的支持,而不仅仅是高端设备。
但是,如果您坚持将单个大型 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);
}