在“tile引擎”中动态加载地图

时间:2011-10-16 16:55:33

标签: c++ algorithm graphics sfml

我正在使用C ++为游戏实现一个tile引擎。目前游戏被划分为地图,每个地图都有一个精灵的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作为图形库,但我不确定这会改变什么

2 个答案:

答案 0 :(得分:3)

改善延迟的不同可能性,但会增加所需的操作总数:
当你离地图“太近”或“太远”时,不要等待,而是在地图上存储玩家周围较大方块的地图[即如果地图是50x50,则存储150x150],但仅显示50x50。现在,每一步 - 计算新的150x150地图,每步需要150个销毁操作,150个构建操作。

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

答案 1 :(得分:2)

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