【问题标题】:Large tmx map And outOfMemory error with AndEngine [closed]AndEngine 的大型 tmx 映射和 outOfMemory 错误 [关闭]
【发布时间】:2014-09-23 01:58:58
【问题描述】:

我的 Andengine 游戏有一个很大的 tmx 地图,大小为 9000*30,当我想将它加载到应用程序中时,我收到了 outOfMemory 错误。 谁能帮我解决这个问题?有什么想法吗?

【问题讨论】:

    标签: android andengine tmx tiled


    【解决方案1】:

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

    【讨论】:

    • 我替换了那个,但仍然无法加载大于 2000 的地图。如何将 tmx 地图分离到多个文件并加载它们??
    • @RezaAhmadi 编辑了一些内容。
    【解决方案2】:

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

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

    【讨论】:

    • tnx 但它不起作用。
    猜你喜欢
    • 2012-10-29
    • 2014-12-19
    • 2014-10-03
    • 2013-03-09
    • 2020-06-27
    • 2014-06-11
    • 2012-08-18
    • 2013-03-29
    • 2015-12-01
    相关资源
    最近更新 更多