大的tmx地图和outOfMemory错误与AndEngine



我有一个大的tmx地图为我的Andengine游戏,这是9000*30的大小,当我想把它加载到应用程序,我得到一个outOfMemory错误。有人能帮我解决这个问题吗?任何想法?

Andengine 根据设计自动分配纹理到内存。如果你得到引擎抛出的OOM错误,你可能做错了什么,或者,至少,设计不鼓励,应该重新考虑替代方案。

在您的示例中,您应该将tmx映射分离为几个不同的文件,并将它们分批加载到Scene中。

这样你就可以将相同数量的内存块分配到几个不同的内存区域,这些内存区域会小得多,因此可以被更多的设备支持,而不仅仅是高端设备。

然而,如果你坚持要将一个大的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);
}

我不确定,试着把它放在你的AndroidManifest.xml

<Application
android:largeHeap="true"
...

最新更新