我目前正在制作基于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游戏世界的提示?
感谢您的时间
答案 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的小事,
你确定你想在每个瓷砖中存储领域吗?无法想象它有什么好处。