2012-03-20 88 views
4

一个小团队的程序员和我正在开发一个带有大型方形世界地图的MMO浏览器游戏,其中每个索引(x,y)指的是地图上的一个图块。每个瓦片都有一对值来存储地形类型ID和随机生成的种子,这些种子将用于程序生成。该地图将在1500x1500至500x500平方米的范围内。有效的方法来存储二维数组/数据表中的数据,以便从PHP快速访问

我们需要一种有效的方式将此表存储在服务器上,最好是存储在SQL数据库中,以便可以访问较小的地图块并将其发送到播放器供浏览器呈现。

以下条件对于访问地图数据总是如此。一旦它被存储在数据库中

  • 完整的地图将永远不会在一次访问

    • 地图数据将永远不会被更新
    • 地图
    • 只有小的矩形部分的部分将在任何给定的查询要访问从一个单一的瓷砖,以在最大50×50平方的表

    考虑到这些条件,将我们的选择是什么在MySQL数据库中存储数据,以便访问数据的矩形部分将是快速,无论da如何,最好是相同的速度ta在桌上的位置?

    我们的小组成员来到了布局SQL表的这种方法,其中的每一行是在地图图块:

    |------------------------------------------------------------| 
    |      table: map       | 
    |------------------------------------------------------------| 
    |  coord  |  tile  | attrs |  seed  | 
    |------------------|----------------|-------|----------------| 
    |mediumint unsigned|tinyint unsigned| text |tinyint unsigned| 
    | unique index |    |  |    | 
    |------------------|----------------|-------|----------------| 
    
    • 坐标:X和Y坐标的组合在世界地图上的瓦片。通过X + (Y<<11)为1500x1500地图计算。 (请注意,50×50的测试图,使用X + (Y<<6)
    • :瓦块的地形类型的数字ID
    • ATTRS:我们需要存储修改瓷砖的任何属性,
    • 种子:对于瓷砖

    没有我们的团队成员都与SQL表的设计经验,所以我们有没有知道的方式,如果这是一个很好的方法,或者是什么瓶颈或SL随机生成的种子我们正在寻找一个答案,在我们的表格的设计中提供我们的选项,以及选择每个选项的优缺点是什么。此外,如果你真的很好,从数据库中拉出地图的矩形块的示例查询(如从(0,0)到(5,5))会很好。

    编辑如果MySQL之外的选项,这将是更快,例如将其存储在,这也是一个有效的答案在服务器上的本地文件,但是我想某种解释,为什么它会在这些条件

    我意识到,这不是一个简单的问题,并会感激你也许能够给

  • +0

    我不清楚为什么你要将它存储在MySql中,而不仅仅是你自己的文件系统在某个文件系统上的文件格式......你将永远不会更新数据,使用地图构建查询,报告关闭地图细节等等......看起来像把MySql引入混合中,这使得它复杂化。 – 2012-03-20 16:20:44

    +0

    如果我们将它存储在一个文件中,我们必须将整个文件加载到php内存中,并读取到存储数据的位置,并对数据的每个请求再次执行此操作。我的理解是,如果表格结构正确,MySQL会更快。如果这不是这种情况,请随时纠正我 – Ryex 2012-03-20 16:24:28

    +0

    如果地图足够小以适应php内存,那么我认为这会比查询MySql的信息快得多。我对php知之甚少,但我假设你有一个类似于散列表的数据结构,你可以用它来检索信息,这可能是最快的解决方案。但是,我不会根据性能做出这个决定......我会选择更简单的实现方式,然后在必要时从那里进行优化。 – 2012-03-20 16:31:42

    回答

    1

    个人的任何帮助,我会表出来像这样下更快。

    地图图块

    id - primary key 
    mapId - indexed 
    xCoord - indexed 
    yCoord - indexed 
    tileId 
    

    地图

    id - primary key 
    tileSetId 
    

    活动

    id - primary key 
    mapId - indexed 
    xCoord - indexed 
    yCoord - indexed 
    proceeduralInstructions 
    

    重要的事查询速度的指标。我在Map Tiles表中添加了mapId,以便可以在此表中存储多个地图。地图表格可以保存地图特定的信息,比如你用来绘制地图的tileset(图像)。事件可以在渲染时添加到地图上。你可能会想出一个简短的程序指令,直接放入数据库,这可以由引擎解释。您可能还会为精灵添加另一个表格,并且可能会为您的地图平铺表格添加另一个表格,以指定要绘制的图层(有些东西会显示在角色的前面,而另一些则会显示在角色的后面)。您甚至可能需要两个前景图层和两个背景图层,以便您可以将部分透明度的图像叠加在一起以获得更丰富的地图。

    +0

    感谢您解释为什么要使用此选项。据我所知,我们永远不需要存储多个地图,但这非常有用。我将它提供的索引属性提供给将用于获取所涉及的磁贴的字段是查找速度的主要来源? – Ryex 2012-03-20 16:41:24

    +0

    @Ryex是的,基本上它减缓了向数据库添加新记录的过程,因为它必须重新索引列,但它将查找速度提高了许多倍。你会注意到拥有多个地图可能是一件好事,因为这可以让你在不同地区(即一个森林地区的一个地图集,一个沙漠地区的地图集等)拥有不同的地图集(图片)必须同时加载所有的tilesets。 – dqhendricks 2012-03-20 16:49:28

    +0

    @Ryex在开始创建我自己的游戏后,我正在考虑将整个地图作为无模式JSON数据存储在中等Blob中的选项,这使我可以随时进行更改以映射数据,并具有更快的读取/写入和较少的索引。但是限制是我绝对想要将每个区域分隔成多个地图,因为每个地区必须一次从数据库中全部加载。 – dqhendricks 2012-04-22 17:59:39

    相关问题