Java 用于存储大型平铺贴图的选项

Java 用于存储大型平铺贴图的选项,java,database,game-engine,procedural-generation,bigdata,Java,Database,Game Engine,Procedural Generation,Bigdata,我正在创建一个基于虚拟回合的在线战略浏览器游戏,其中许多人在同一个世界中玩了很长一段时间(几个月)。为此,我希望有一个64000x64000瓷砖=40亿瓷砖的地图。我需要每个磁贴大约6-10字节的数据,总共约30GB的数据用于存储地图 每个瓷砖应具有以下属性:类型(水、草、沙漠、山)、资源(木材、奶牛、黄金)和玩家建筑(道路、建筑) 客户只需要同时访问大约100x100个瓷砖 我已经控制了客户端的地图。我面临的问题是如何在服务器端存储、检索和修改此地图中的信息 所需功能: 创建、存储和修改640

我正在创建一个基于虚拟回合的在线战略浏览器游戏,其中许多人在同一个世界中玩了很长一段时间(几个月)。为此,我希望有一个64000x64000瓷砖=40亿瓷砖的地图。我需要每个磁贴大约6-10字节的数据,总共约30GB的数据用于存储地图

每个瓷砖应具有以下属性:类型(水、草、沙漠、山)、资源(木材、奶牛、黄金)和玩家建筑(道路、建筑)

客户只需要同时访问大约100x100个瓷砖

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

所需功能:

  • 创建、存储和修改64000x64000平铺贴图
  • 向客户端显示地图的100x100部分
  • 在地图上进行修改,例如道路、建筑物和耗尽的资源
  • 到目前为止,我考虑的是:

  • 程序生成:动态地按程序生成地图的任何部分。确保给定相同的种子,它总是生成相同的映射。我遇到的主要问题是,在游戏中会对地图进行修改。注意:在游戏期间,只有不到1%的瓷砖会被修改,并且可以将修改后的瓷砖与坐标一起存储在外部阵列中。在程序生成的顶部加载它们
  • 数据库:在游戏开始时生成地图并将其存储在数据库中。一位朋友建议我不要这样做,因为我有这么大的一张瓷砖地图,并告诉我,我可能想把它存储在内存中
  • 将其全部保存在服务器端的内存中:将其保存在数据结构的内存中。如果地图更小,但对于40亿个瓷砖来说,这将是一个很好的方法,这将是一个很大的内存保留
  • 我计划在这个项目的后端使用java+mysql。我仍处于早期阶段,如果需要,我愿意改变技术

    我的问题是:上述三种方法中,哪一种似乎可行,或者有没有其他我没有考虑过的方法

    • 你有多少内存(或玩家/用户有多少内存)
    • 大多数平铺贴图是否为空(稀疏)?对面是密集的
    • 是否有默认地形(如空地形或水地形?)
    如果稀疏,请使用哈希映射而不是二维数组

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

    欢迎使用SO!你可能会得到这个问题的一些有用的答案,但总的来说,对于这个网站来说,它实在太宽泛了。正确的答案是“这取决于”游戏设计的诸多因素。如果您可以更具体地了解在每个解决方案中看到的问题,并询问如何解决这些问题,那么您可能会得到更好的信息。如果这对您来说过于宽泛,请不要感到惊讶。每个磁贴大约有多少数据?每个磁贴8位的解决方案将与每个磁贴1 mb的解决方案大不相同…Sprinter-感谢您的欢迎,我将在将来尽量使其更简洁。Pikalek-每个磁贴大约有16字节的数据。这16字节的数据到底是什么?通过只存储对公共值组合的引用,完全有可能使磁贴消耗更少的内存。牛不生活在水里,所以类型和资源可能以一种有用的方式结合在一起。谢谢我当时的想法是:我需要一些位(2字节?)来确定类型(草)和资源类型(牛、金)。然后,我需要两个更大的整数(每个4字节)来确定剩余的资源量和对潜在playerBuiltObject的ID引用。这构成了大约10字节的上限,除非我需要存储任何附加信息。平均约为6字节,因为只有不到1%的磁贴具有PlayerBuilton对象。