【问题标题】:Dynamically loading maps in a "tile engine"在“平铺引擎”中动态加载地图
【发布时间】:2011-12-08 19:21:04
【问题描述】:

我正在使用 C++ 为游戏实现磁贴引擎。目前游戏分为多个地图,每个地图都有一个 2D 精灵网格,每个精灵代表一个图块。

我正在编写一个系统,如果有几张地图相邻,您可以从一张地图走到另一张地图。 在游戏开始时,所有的地图都被实例化但被“卸载”,即精灵对象不在内存中。当我离相邻的地图足够近时,地图精灵基本上会通过以下方式“加载”到内存中:

for(int i=0; i < sizeX; i++) {
    for(int j=0; j < sizeY; j++) {
        Tile *tile_ptr = new Tile(tileset, tilesId[i][j], i + offsetX, j + offsetY);
        tilesMap[i][j] = tile_ptr;
    }
}

当我离地图太远时,它们会以同样的方式被摧毁。

对于 32x32 像素的 50x50 精灵地图,加载或卸载大约需要 0.3 秒,这在 1 帧内完成。我的问题是:即使使用完全不同的机制,动态加载/卸载地图的更有效方法是什么?谢谢

PS:我使用 SFML 作为图形库,但我不确定这会改变什么

【问题讨论】:

    标签: c++ algorithm graphics sfml


    【解决方案1】:

    改善延迟的另一种可能性,但会增加所需的操作总数:
    不要在离地图“太近”或“太远”时等待,而是将地图存储在内存中,以便在玩家周围形成更大的正方形 [即如果地图是 50x50,则存储 150x150],但仅显示 50x50。现在,每一步 - 计算新的 150x150 地图,每一步都需要 150 个销毁操作和 150 个构建操作。

    这样做,您实际上需要计算和构建/销毁元素更多次!但是,延迟会有所改善,因为您不需要等待 0.3 秒来构建 2,500 个元素,因为您总是需要一小部分:150*2 = 300 个元素。

    【讨论】:

      【解决方案2】:

      我认为这是学习多线程和异步调用的绝佳机会。
      如果您是新手,它可能看起来很复杂,但它是一项非常有用的技能。
      仍然需要 0.3 秒才能加载(嗯,实际上要多一点),但游戏不会冻结。
      这就是大多数游戏所做的。您可以搜索 SO 以了解在 C++ 中执行此操作的各种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        相关资源
        最近更新 更多