gpt4 book ai didi

java - libGDX:如何渲染瓦片 map ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:45 24 4
gpt4 key购买 nike

我想绘制一张由一组有限的不同缩放级别的图 block 组成的 map ,例如谷歌地图。我之所以考虑使用瓦片是因为 map 非常大,在最高放大倍数下整个 map 非常大(大约 15000 到 20000 像素)。

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

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

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

谢谢!!!!

最佳答案

“我将如何组织 map 图 block 对象本身?”:
a) 您可以将图 block 分组为区域;
b) 然后您的查看器/相机仅绘制 View 中的区域(如平截头体剔除,但不是针对每个图 block ,因为询问每个图 block 是否在 View 中的成本太高);
c) 每个绘制的 Area 在正确的位置绘制它的 Tiles(相对于 Area.position)。

这里的问题是“我什么时候最好加载磁贴?”可以用答案解决:
- 最好的方法是在绘制调用之前加载 sprite,并且只加载 View 中的 Area.Tiles;
- 从池中加载 Sprite 。

我在 Map 1000 x 1000 tiles 上测试了这种方法,
我的查看器( Activity 瓷砖)是 3 x 3 区域(90 x 90 瓷砖)。使用这种方法, map 有多大(当您的计算机有内存时:))对性能无关紧要,只有查看器大小很重要...


如果查看器可以有更大的尺寸 - 那么您可以将整个 Area.Tiles 预渲染到纹理并直接为每个帧上的每个可见区域绘制一个 Area.texture。

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

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

关于java - libGDX:如何渲染瓦片 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com