【问题标题】:Best way to store inventory in a database : each item instance gets its listing, or each player has an "inventory" field?将库存存储在数据库中的最佳方式:每个项目实例都有其列表,或者每个玩家都有一个“库存”字段?
【发布时间】:2012-03-29 11:42:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我猜几乎所有系统都使用更类似于类型 1 的东西,因为类型 2 是一个名为“Jaywalking”的antipattern。源于对路口的恐惧。
  • 玩家的库存有限吗?他们有说,有 10 个插槽可用吗?还是受重量限制或类似的限制?
  • @MarcusAdams - 该死!我以为我发现了一些聪明的东西。
  • @MichaelFredrickson - 有限制,但没有设置。他们可以从技能、包包等方面改变。
  • 在这个开发阶段我不会过分关注存储吞吐量。提防早期优化。假设您预计在短时间内会有大量事务,您可能会在内存缓存中执行大部分事务,这些事务将根据需要刷新到数据库中,以免阻止玩家 UI 请求。

标签: mysql inventory mmo


【解决方案1】:

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

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

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

【讨论】:

  • 那么就决定了,这就是我将要使用的!
猜你喜欢
  • 2013-02-28
  • 2017-11-17
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
相关资源
最近更新 更多