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

标签 java opengl libgdx quadtree

我想绘制一张由一组有限的不同缩放级别的图 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/

相关文章:

c++ - 是否有一种优雅的方式来处理 Windows OpenGL 应用程序中全屏和窗口模式之间的切换?

java - Libgdx Scene2d 表和滚动 Pane 错误?

java - 无法加载简单图像。 Libgdx

java - Mongodb数据库Schema设计技巧

java - Kotlin 模块源未打包在 aar 中

java - box2d 中的旋转关节

android - libgdx 如何集成 admob 插页式 _between_ 游戏屏幕

java - 将整数转换为二进制并打印数字之和

c++ - c++中基于点的重力示例

c++ - 红皮书毛皮示例不渲染毛皮 (Linux/nvidia gtx675mx)