【发布时间】:2012-03-29 11:42:46
【问题描述】:
我正在使用 PHP 和 MySQL 制作浏览器 MMO。我在两种实现玩家库存的方法之间犹豫不决:
从怪物制作/掉落/发现时,物品会在物品表中创建一个新行,存储其类型(例如匕首、药水...) ,它的位置(在 X:Y 的地面上?在玩家 Z 的库存中?),可能还有一两个额外的字段。商品列表如下所示:
id=728 ; type=14 ; location="i426" ; special="e8"
(其中“i426”表示“在第 426 号玩家的物品栏中”,而“e8”表示该物品具有第 8 号附魔)。
优点:我可以存储数据关于每个单独的物品 - 附魔,耐用性,以前的所有者......此外,这些物品很容易放置在任何位置;将物品放入拍卖行,这个系统是免费的 - 更不用说疯狂的可能性,比如物品里面的物品等等。
缺点:有数百名玩家抢劫怪物和制作一整天,这很快就创建了一张巨大的桌子,看起来很浪费。我担心这可能会减慢整个游戏的速度(我使用了很多 AJAX voodoo),无论何时涉及项目。或者:当玩家将物品放入他们的物品栏时,该玩家在数据库中的物品栏字段会更新为新物品的类型(整数)在末尾附加,带有分隔符。典型的库存字段如下所示:
"|11|8|27|58|58"
优点: 浪费更少。一个项目实例只有几个数字和一个分隔符。
缺点:没有关于项目的额外数据;每个实例都是相同的。此外,将项目放在图块上意味着图块需要自己的库存字段 - 等等,用于项目的每个可能位置。此外,此方法涉及在必须添加/删除项目时随时处理字符串,而不是简单地从表中删除一行。另一件事是玩家的物品栏可以存储可变数量的物品,所以这个字符串没有可预测的长度。
在之前的项目中,我使用了第二种方法。第一种方法看起来很有趣,但我不确定它是否符合我们的存储空间和服务器的速度。哪些方法最常用于 MMO 游戏?完全是另一个吗?我错过了一些优点或缺点吗? (如果这个问题有点主观,我很抱歉!)
【问题讨论】:
-
我猜几乎所有系统都使用更类似于类型 1 的东西,因为类型 2 是一个名为“Jaywalking”的antipattern。源于对路口的恐惧。
-
玩家的库存有限吗?他们有说,有 10 个插槽可用吗?还是受重量限制或类似的限制?
-
@MarcusAdams - 该死!我以为我发现了一些聪明的东西。
-
@MichaelFredrickson - 有限制,但没有设置。他们可以从技能、包包等方面改变。
-
在这个开发阶段我不会过分关注存储吞吐量。提防早期优化。假设您预计在短时间内会有大量事务,您可能会在内存缓存中执行大部分事务,这些事务将根据需要刷新到数据库中,以免阻止玩家 UI 请求。