【问题标题】:libGDX: How to render a tilemap?libGDX:如何渲染瓷砖地图?
【发布时间】:2015-01-06 13:27:51
【问题描述】:

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

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

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

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

谢谢!!!!

【问题讨论】:

    标签: java opengl libgdx quadtree


    【解决方案1】:

    '我将如何组织地图图块对象本身?':
    a) 您可以将图块分组到区域中;
    b)然后您的查看器/相机仅绘制视图中的区域(例如平截头体剔除,但不是针对每个图块,因为询问每个图块是否在视图中太昂贵了);
    c) 每个绘制的区域都在正确的位置(相对于 Area.position)绘制其瓷砖。

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

    我在 Map 1000 x 1000 瓦片上测试了这种方法,
    我的查看器(活动瓷砖)是 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
        }
    }
    

    【讨论】:

    • 您好 Dimitriy 感谢您的回答。我对您的解决方案有几个问题。 “我将如何组织地图瓦片对象本身?”:在四叉树中组织瓦片已经是:四个瓦片组合在一起,然后任何类型的平截头体剔除首先需要检查是否需要在某个点绘制该组.然后将对所有子组递归地完成。 '我什么时候最好加载图块?':如果图块将在绘制调用之前直接(同步)加载,它们需要从磁盘加载。
    • 第二部分:加载纹理可能需要超过 1/16ms 的时间,从而大幅降低 FPS。有什么方法可以异步加载纹理?
    • 我在上面添加了新信息来回答
    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多