2

我正在使用 PHP 和 MySQL 制作浏览器 MMO。我在两种实现玩家库存的方法之间犹豫不决:

  1. 当从怪物/发现中制作/掉落时,物品会在物品表中创建一个新行,存储它的类型(例如匕首、药水......)、位置(在 X:Y 的地面上?在玩家 Z 的物品栏中?)可能还有一两个额外的字段。物品列表如下所示:(
    id=728 ; type=14 ; location="i426" ; special="e8"
    其中“i426”表示“在第 426 号玩家的物品栏中”,“e8”表示该物品具有第 8 号附魔)。
    优点:我可以存储关于每个单独物品的数据——附魔、耐用性、以前的所有者......而且,这些物品很容易放置在任何位置;将物品放入拍卖行,这个系统是免费的 - 更不用说疯狂的可能性,比如物品里面的物品等等。
    缺点:数百名玩家整天掠夺怪物并制作,这很快就会创建一个巨大的桌子,而且看起来很浪费。我担心这可能会在涉及项目时减慢整个游戏(我使用了很多 AJAX 巫术)。

  2. 或:当玩家将物品放入他们的物品栏时,该玩家在数据库中的物品栏字段会更新,并在末尾附加新物品的类型(整数),并带有分隔符。典型的库存字段如下所示:"|11|8|27|58|58"
    优点:浪费更少。一个项目实例只是几个数字和一个分隔符。
    缺点:没有关于项目的额外数据;每个实例都是一样的。此外,将项目放在图块上意味着图块需要自己的库存字段 - 等等,用于项目的每个可能位置。此外,此方法涉及在必须添加/删除项目时随时处理字符串,而不是简单地从表中删除一行。另一件事是玩家的物品栏可以存储可变数量的物品,所以这个字符串没有可预测的长度。

在之前的项目中,我使用了第二种方法。第一种方法看起来很有趣,但我不确定它是否符合我们的存储空间和服务器的速度。哪些方法最常用于 MMO 游戏?完全是另一个吗?我错过了一些优点或缺点吗?(如果这个问题有点主观,我很抱歉!)

4

1 回答 1

3

你最好的设计是方法 1 的一个版本:每个项目都有自己的行,你把所有必要的信息放在那里。不要担心优化——稍后当您了解用户如何使用您的系统以及瓶颈在哪里时,您将有时间进行优化。

现在,您希望设计易于编程和清晰、明确的状态描述。您需要每个“类型”项目的主项目表,在其中保存有关该项目是什么以及如何使用它的信息。然后,当创建(或实例化)时,您在项目表中放置一行并描述该项目实例的细节。当它移动时,您可以更新位置信息。这并不浪费,因为您只存储了管理项目所需的信息——一次且在正确的位置。

通过将正确的索引放在表上,您将能够轻松快速地管理数百万个索引。

于 2012-03-14T12:29:22.297 回答