为在线多人游戏存储大型基于图块的地图

时间:2010-09-19 05:42:42

标签: data-structures

我目前正在制作基于mmorpg的瓷砖,并且我正在努力寻找一种存储大型2D游戏世界的好方法(至少1000平方的瓷砖,但希望更像是几千平方)。这个想法是鼓励人们在共享地图上建立自己的城市,用户将能够建造房屋和商店,以便能够编辑图块并与某些链接表具有一对多的关系。我正在考虑以64x64瓦片块的形式将它们发送到客户端。

我目前在php / mysql中工作,我的表看起来像:

CREATE TABLE  `fbmmo`.`tiles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `x` int(11) NOT NULL,
  `y` int(11) NOT NULL,
  `realm` varchar(45) NOT NULL,
  `image_id` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `Index_X` (`x`),
  KEY `Index_Y` (`y`)
) ENGINE=InnoDB AUTO_INCREMENT=4327236 DEFAULT CHARSET=latin1;

和查询大致相似

select * from tiles where x<1000 and y<1000 and x>936 and y>936;

当我只有大约五十万条记录时,它只需要大约半秒钟,但是当我达到大约400万条记录时,它需要大约5秒钟,我确信有一些方法可以改善它。 / p>

我可以通过缓存地图请求来解决这个问题,但我想知道是否有更好的配置数据库的方法,以及是否有人有有效存储大型2D游戏世界的提示?

感谢您的时间

3 个答案:

答案 0 :(得分:1)

随着数据集大小的增加,范围查询可能会非常快速地失控。您可能想看一些关于此的文献。这是一些有趣的论文。

范围查询的数据结构:

http://portal.acm.org/citation.cfm?id=1035798

www.siam.org/proceedings/soda/2010/SODA10_014_yuanh.pdf

快速搜索的算法

www.cccg.ca/proceedings/2005/3.pdf

答案 1 :(得分:0)

也许你可以在数据库级别对块进行分块?

答案 2 :(得分:0)

只是我的小2分。也许,根据ppl滚动地图的方式,您可以预取下一个N个可访问的64x64磁贴集。关于image_id varchar(45)NOT NULL的小事, 你确定你想在每个瓷砖中存储领域吗?无法想象它有什么好处。