我正在使用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作为图形库,但我不确定这会改变什么
答案 0 :(得分:3)
改善延迟的不同可能性,但会增加所需的操作总数:
当你离地图“太近”或“太远”时,不要等待,而是在地图上存储玩家周围较大方块的地图[即如果地图是50x50,则存储150x150],但仅显示50x50。现在,每一步 - 计算新的150x150地图,每步需要150个销毁操作,150个构建操作。
通过这样做,您实际上需要更多次计算和构建/销毁元素!但是,延迟会有所改善,因为您不需要等待0.3秒来构建2,500个元素,因为您总是需要一小部分:150 * 2 = 300个元素。
答案 1 :(得分:2)
我认为这是学习多线程和异步调用的完美场合 如果你是新手,它看起来很复杂,但它是一个非常有用的技能 加载仍然需要0.3秒(实际上更多一点),但游戏不会冻结 这就是大多数游戏的作用。您可以搜索SO以了解在C ++中执行此操作的各种方法。