Search code examples
javaperformancelibgdx

LibGDX: Drawing 50x50 tiles is very slow


I found some code on the libgdx GitHub that creates a tiled map and populates it. It all works fine until you enlarge the camera to draw ~50x50 tiles. At this point, I get ~5 fps and input is barely responding. Here is the modified code:

public class Core extends ApplicationAdapter {

    private AssetManager am;
    private SpriteBatch batch;
    private BitmapFont font;
    private TiledMap map;
    private OrthogonalTiledMapRenderer renderer;
    private OrthographicCamera camera;
    private OrthoCamController cameraController;

    @Override
    public void create() {
        am = new AssetManager();
        am.load("tiles.png", Texture.class);
        am.finishLoading();

        float w = Gdx.graphics.getWidth();
        float h = Gdx.graphics.getHeight();

        batch = new SpriteBatch();
        batch.disableBlending();

        camera = new OrthographicCamera();
        camera.setToOrtho(false, (w / h) * 400, 400);
        camera.update();

        cameraController = new OrthoCamController(camera);
        Gdx.input.setInputProcessor(cameraController);

        font = new BitmapFont();

        map = new TiledMap();
        MapLayers layers = map.getLayers();
        TiledMapTileLayer layer = new TiledMapTileLayer(200, 200, 8, 8);
        TextureRegion[][] splitTiles = TextureRegion.split((Texture)am.get("tiles.png"), 8, 8);
        for (int x = 0; x < 1000; x++) {
            for (int y = 0; y < 1000; y++) {
                int ty = 1;
                int tx = 1;
                Cell cell = new Cell();
                cell.setTile(new StaticTiledMapTile(splitTiles[ty][tx]));
                layer.setCell(x, y, cell);
            }
            layers.add(layer);
        }
        renderer = new OrthogonalTiledMapRenderer(map, batch);
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(100f / 255f, 100f / 255f, 250f / 255f, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        camera.update();
        renderer.setView(camera);
        renderer.render();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void dispose() {
        am.dispose();
        map.dispose();
    }
}

I seriously doubt that Libgdx can't handle that many tiles so my question is: how do I improve performance... or am I being too ambitious?

The only solution I could find was here but it looks like they removed the method used in it.


Solution

  • You probably want to put layers.add(layer); outside the for (int x = 0; x < 1000; x++) loop