一个小团队的程序员和我正在开发一个带有大型方形世界地图的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之外的选项,这将是更快,例如将其存储在,这也是一个有效的答案在服务器上的本地文件,但是我想某种解释,为什么它会在这些条件
我意识到,这不是一个简单的问题,并会感激你也许能够给
我不清楚为什么你要将它存储在MySql中,而不仅仅是你自己的文件系统在某个文件系统上的文件格式......你将永远不会更新数据,使用地图构建查询,报告关闭地图细节等等......看起来像把MySql引入混合中,这使得它复杂化。 – 2012-03-20 16:20:44
如果我们将它存储在一个文件中,我们必须将整个文件加载到php内存中,并读取到存储数据的位置,并对数据的每个请求再次执行此操作。我的理解是,如果表格结构正确,MySQL会更快。如果这不是这种情况,请随时纠正我 – Ryex 2012-03-20 16:24:28
如果地图足够小以适应php内存,那么我认为这会比查询MySql的信息快得多。我对php知之甚少,但我假设你有一个类似于散列表的数据结构,你可以用它来检索信息,这可能是最快的解决方案。但是,我不会根据性能做出这个决定......我会选择更简单的实现方式,然后在必要时从那里进行优化。 – 2012-03-20 16:31:42