繁体   English   中英

libGDX:如何渲染tilemap?

[英]libGDX: How to render a tilemap?

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

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

这样的案例是否有“最佳实践”?

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

谢谢!!!!

“我如何组织地图图块对象本身?”:
a)你可以将瓷砖分组到区域;
b)然后你的观察者/摄像机仅绘制视野中的区域(如截头剔除,但不是每个瓷砖,因为询问每个瓷砖是否太昂贵,如果它在视野中);
c)每个绘制区域在正确位置(相对于Area.position)绘制其Tiles。

这里有关于“我什么时候能最好装载瓷砖?”的问题。 可以用答案解决:
- 最好的方法是在绘制调用之前加载精灵,并且仅在视图上为Area.Tiles加载精灵;
- 从池中加载精灵。

我在Map 1000 x 1000瓷砖上测试了这种方法,
我的Viewer(活动图块)是3 x 3区域(90 x 90图块)。 并且通过这种方法,性能与地图有多大并没关系(当你的计算机有内存:)时,只有观众大小才重要...


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM