存储巨大瓷砖地图的选项

时间:2017-03-22 08:08:37

标签: java database game-engine procedural-generation bigdata

我正在创建一个基于伪回合制的在线策略浏览器游戏,许多人在很长一段时间(几个月)内在同一个世界中玩游戏。为此,我想要一张64000x64000瓦片= 40亿瓦片的地图。我每个磁贴需要大约6-10个字节的数据,总共大约30GB的数据用于存储地图。

每个瓷砖应具有类型(水,草,沙漠,山),资源(木材,奶牛,黄金)和playerBuilt(道路,建筑)等属性

客户端只需要同时访问大约100x100个磁贴。

我已经在客户端处理了地图。我面临的问题是如何在服务器端存储,检索和修改此地图中的信息。

所需功能:

  1. 创建,存储和修改64000x64000 tilemap。
  2. 向客户端显示100x100的地图部分。
  3. 在地图上进行修改,例如道路,建筑物和耗尽的资源。
  4. 到目前为止我所考虑的事项:

    1. 程序生成:在运行中需要按程序生成地图中的任何一部分。确保给定相同的种子,它始终生成相同的地图。我遇到的主要问题是在游戏过程中会对地图进行修改。注意:在游戏过程中,不到1%的图块会被修改,并且可以在外部数组中存储带坐标的修改。将它们加载到程序代之上。
    2. 数据库:在游戏开始时生成地图并将其存储在数据库中。一位朋友建议我反对这个巨大的瓷砖地图,并告诉我,我可能想把它存放在内存中。
    3. 将所有内容保存在服务器端的内存中:将其保存在数据结构的内存中。如果地图较小,那么看起来就像是一种很好的方法,但对于40亿块瓷砖来说,这将是很多内存。
    4. 我打算在这个项目中使用java + mysql作为后端。我还处于早期阶段,如果需要,我们愿意改变技术。

      我的问题是:上述三种方法中哪一项似乎可行和/或是否有其他方法可以做到这一点我还没有考虑过?

1 个答案:

答案 0 :(得分:0)

取决于:

  • 你获得了多少内存(或玩家/用户获得)
  • 大多数瓷砖地图是空的(稀疏的)?对面是密集的。
  • 是否有默认地形(如空或水?)

如果是稀疏的,请使用散列图而不是2D数组。

如果密集,那将更具挑战性,您可能需要使用数据库或一些特殊的数据结构+缓存。 您可以检测到热区并将其保留在内存中一段时间​​,死区(没有玩家,没有活动......)可以存储在数据库中并按需读取。 您也可以在几个过程中加载数据:首先是地形,然后是其他对象......每个层都可以以不同的方式存储。例如,地形可能是生成的perlin噪声+另一个可以修改的层。