libGDX:如何渲染tilemap?

时间:2014-11-10 09:28:46

标签: java opengl libgdx quadtree

我想绘制一个由不同缩放级别的有限瓷砖组成的地图,就像谷歌地图一样。我考虑使用瓷砖的原因是因为地图非常大,并且在最高放大率下整个地图非常大(大约15000到20000像素)。

现在我考虑创建一个四叉树来组织瓷砖。每次绘制一个帧时,四叉树逻辑将评估要渲染的图块,以便渲染时间最短。 但是,我如何组织地图图块对象本身?我什么时候能最好地加载瓷砖? 为每个图块创建一个精灵似乎有点矫枉过正,因为图块和位置的尺寸保持不变。在这种情况下,SpriteCache似乎没有帮助,因为我每帧只绘制一个映射的子集。 此外,在几种情况下有很多优点和缺点: 当我在启动应用程序时加载所有切片时,将需要很长时间才能加载所有切片并将它们缓存在GPU中(甚至不认为所有切片都适合内存)。 当我在运行时加载必要的tile时,我想在渲染tile时会遇到一些延迟。

这样的案例是否有“最佳做法”?

我知道对此没有正确或错误的答案,但我想听听解决这个问题的其他建议。

感谢!!!!

1 个答案:

答案 0 :(得分:2)

'我如何组织地图图块对象本身?':
a)您可以将瓷砖分组到区域中;
b)然后您的观察者/摄像机仅绘制视野中的区域(如截头剔除,但不是每个瓷砖,因为询问每个瓷砖是否过于昂贵); c)每个绘制区域在正确的位置绘制其瓷砖(相对于Area.position)
这里的问题是关于我什么时候能最好地加载瓷砖?'可以用答案解决:
- 最好的方法是在绘制调用之前加载精灵,并且仅在视图上加载Area.Tiles;
- 从池中加载精灵
我在Map 1000 x 1000瓷砖上测试了这种方法,
我的Viewer(活动图块)是3 x 3区域(90 x 90图块)。使用这种方法对于性能有多重要而不是地图(当你的计算机有内存:)时,只有观众大小很重要......


如果观察者可以拥有更大的维度 - 那么你可以预渲染整个Area.Tiles来纹理并直接为每个帧上的每个可见区域绘制一个Area.texture。

应用程序启动时应首先加载纹理 在查看器创建时以及向上/向下/向左/向右移动一个区域时,纹理可以链接到切片。

for (Area area : Viewer.areas) {
    for (Tile tile : area.tiles) {
        tile.texture = <loaded_texture> OR tile.image = new Libgdx.Image(<loaded_texture>) OR any other appropriate for your tile object way
    }
}