在线多人游戏中存储大型基于瓷砖的地图

4
我目前正在制作一个基于瓷砖的大型多人在线角色扮演游戏,并试图找到一种良好的方法来存储一个大型的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;

当我只有大约50万条记录时,只需要大约半秒钟,但是当我达到约400万条记录时,需要大约5秒钟,我相信有一些方法可以改善这种情况。

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

感谢您的时间。


1
尝试在(x,y)上添加索引。 - joschi
3个回答

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


0
也许你可以在数据库层面上对瓦片进行分块处理?

我有其他表格链接到瓦片的ID,例如NPC表和物品表等。如果我将它们分块,我将失去这些ID,并且如果我只需要更新少量瓦片,则更新瓦片将更加困难。但是,我可以让NPC /物品等以x和y为键,而不是tile_id,但我不知道这是否是最佳解决方案。 - digi

0

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


我目前正在预取下一组瓷砖集,只是它需要一些时间,我担心如果我的游戏变得流行起来,它将如何处理高负载。领域只是为了我未来想做的事情而存在。 - digi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接