基于浏览器的MMO最佳实践

3
我正在开发一个基于Google地图的在线浏览器游戏,使用Django后端。现在我需要决定如何实现(后端)定时事件 - 即NPC所有权数量的提高(例如城市人口应该根据一些变量增长 - 城市规模、应用程序速度等)。
我找到的可能的解决方案有:
  • 将排队的操作放入表中,并在每个请求中处理它们。
    • 问题:巨大的开销,更难实现
  • 使用cron或类似工具
    • 问题:这是一个外部工具,我希望尽可能少使用外部工具。
还有其他解决方案吗?

1
不同意它是https://dev59.com/w0zSa4cB1Zd3GeqPq_Am的副本。这个问题正在询问如何实现计划事件,而不是客户端/服务器通信。 - chrisbunney
2个回答

5
运行定时任务以在您的游戏中执行更新,无论间隔多长时间,都会导致数据库使用量激增。如果您的游戏逻辑依赖于所有这些数据库值同时更新(如果您正在运行基于间隔的更新,则非常可能),则必须在 cronjob 运行的同时进行计划维护。随着玩家人数的增加,当这段时间变得更长时,这将变得极其烦人。
如果您想减少数据库开销,应该存储带有其最后更新时间和增长率的值,仅在数量或增长率发生变化时才更新这些行。
例如,一个每分钟增长5个金币的金库,只有在玩家从中提取金币时才进行更新。当您需要知道当前金额时,它是根据上次更新时间、当前时间、上次更新时存储的金额和增长率进行计算的。
随着时间的推移而发生变化的数据,不应存储在数据库中,而应存储在游戏逻辑端。当玩家执行需要记住的活动或计算变得太麻烦以至于需要再次生成时,才将其存储。

+1 是指出维护基于时间的函数,让您在需要时计算值。 - Chris Marisic
完全同意你的看法,但是。 在我看来,我的(基于ajax的)应用程序用户会在加载城市信息时更新他所在城市的人口数量(这可能是由他或任何其他玩家完成的,可能每隔几秒钟一次 - 我在谈论大规模的情况,因为对于较小的规模,我不会担心开销)。 问题是,我可以妥协并将城市人口每20分钟更新一次,这既不会伤害用户也不会伤害数据库。 我并不是说你错了,我只是需要更好地理解这个问题。 - Gabi Purcaru
1
当人口更新时,Gabi的增长率是否因为所有者或其他人所做的事情而改变?如果是这样,那么在执行该操作时更新数据库。但是,如果人口将以相同的速度继续增长,无论玩家是否存在,那么您不希望在数据库中更新人口。需要时可以实时计算。对于静态增长率,(currentPop = popFromDatabase +(rateOfGrowth *(serverTime - timeOfLastUpdate)))。如果是指数增长,您可以编写递归函数或使用一些适当的数学函数。 - Frank Crook
事实上,人口以恒定的速度增加,用户可以“雇用”人员,因此人口会减少。 这个公式的想法听起来非常不错。我想我会使用它。当前的人数将是类似于速率*自城市添加以来的时间-总雇用人数的东西。 - Gabi Purcaru

2

这看起来很有趣,我会试一下。 - Gabi Purcaru

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