Andmngine的大tmx map和outOfMemory错误

时间:2014-07-31 07:54:22

标签: android andengine tmx tiled

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

2 个答案:

答案 0 :(得分:0)

我不确定,请尝试将其放入AndroidManifest.xml

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

答案 1 :(得分:0)

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);
}