Redis如何表示2D世界(MMO?)

时间:2012-01-15 22:56:27

标签: redis

我正在制作一个拥有2D世界的MMO。 (这是一个学习项目,所以不要试图说服我:)我想为它试验一个新的数据存储,我已经阅读了关于redis的好东西。我已经完成了这些教程,我认为我已经开始了解redis的优势,但我不清楚如何为这样一个世界建模。

以下是一些设计要求

  1. 我需要能够发送世界上元素的当前位置。将这些划分为地理“房间”以进行表演是可以接受的。
  2. 我需要能够“移动”世界上的一个物体,改变它的位置
  3. 我需要获取有关对象的信息:它的名称,类型,属性等等。
  4. 我需要能够计算基本碰撞(obj a想要向右移动,那里有岩石吗?)
  5. 你如何用redis建模? redis是不合适的选择吗?

2 个答案:

答案 0 :(得分:2)

假设2D世界被分割成已知坐标的正方形,你可能最好在redis中根据返回对象ID(或退出/路径,或地形等)的坐标来生成关键点

e.g。一个非常简单的插图

obj:1:name = Rock
obj:1:passable = false
obj:2:name = Skeleton
obj:2:passable = true
loc:0:0:objs = {1,2} // loc:0:0 contains obj:1 and obj:2
loc:0:0:paths = {0:1, 1:0, 1:1} // three legal paths, to loc:0:1, loc:1:0, loc:1:1

我不足以让redis专家知道这个域名是否会导致你在redis中出现问题,所以请不要理睬我的建议。

答案 1 :(得分:1)

Redis是一个键值商店,并且可能不太适合开箱即用的这项任务,但如果我要对此进行刺戳,我可能会读到R树(或其他空间)面向数据结构)然后将这样的数据结构映射到键值存储模式上。例如,您可以将您的MMO世界设置为 Redis中的R-tree ,方法是让树中的每个节点对应Redis中的特定键,然后将包含边界矩形(和/或其他叶子数据)和指向每个子节点的键列表。

这至少可以让你保持你的值大小受限(一个属性不一定由平坦,统一的网格表示共享),并保持任何给定操作所需的Redis查找次数为log(n)的顺序

玩得开心!听起来像是一种有趣的学习方式。