Python 基于浏览器的MMO最佳实践

Python 基于浏览器的MMO最佳实践,python,django,cron,Python,Django,Cron,我正在开发一款基于谷歌地图的带有Django后端的在线浏览器游戏,我需要决定如何实施(后端)定时事件,即NPC占有量增加(例如,城市人口应根据一些变量增长——城市规模、应用速度) 我找到的可能解决方案有: 将排队的操作放入表中,并与每个请求一起处理它们。 问题:巨大的开销,难以实现 使用cron或类似的东西 问题:这是一个外部工具,我需要尽可能少的外部工具 还有其他解决方案吗?如果我理解你的问题是正确的,你应该看看芹菜,它是一个分布式任务队列 在游戏中以任意间隔运行预定任务以执行

我正在开发一款基于谷歌地图的带有Django后端的在线浏览器游戏,我需要决定如何实施(后端)定时事件,即NPC占有量增加(例如,城市人口应根据一些变量增长——城市规模、应用速度)

我找到的可能解决方案有:
  • 将排队的操作放入表中,并与每个请求一起处理它们。
    • 问题:巨大的开销,难以实现
  • 使用cron或类似的东西
    • 问题:这是一个外部工具,我需要尽可能少的外部工具

还有其他解决方案吗?

如果我理解你的问题是正确的,你应该看看芹菜,它是一个分布式任务队列

在游戏中以任意间隔运行预定任务以执行更新,将使您大量使用数据库。如果游戏逻辑依赖于所有这些数据库值同时处于最新状态(如果您正在运行基于间隔的更新,这很可能),那么在cronjob运行期间,您必须有计划的停机时间。当这段时间变长时,随着玩家基数的增加,这会变得非常烦人

如果您试图减少数据库开销,则应存储带有上次更新时间和增长率的值,并且仅在增长量或增长率发生变化时更新这些行

例如,一个每分钟增长5金的黄金储备,只有当玩家从中取出黄金时才会更新。当您需要知道当前金额时,将根据上次更新时间、当前时间、上次更新时存储的金额以及增长率计算当前金额


随时间变化而不需要交互的数据不属于数据库。它属于游戏的逻辑终点。当玩家执行您需要记住的活动时,或者计算变得过于繁琐而无法再次生成时,您需要存储它。

不同意这是一个重复,因为这个问题是关于执行计划事件的问题,不是客户端/服务器通信+1,指出维护基于时间的函数,让您在需要时计算价值。完全同意您的意见,但是。正如我所看到的,我的(基于ajax的)应用程序用户在加载城市信息时会更新他的,比如说城市人口(这可能由他或任何其他玩家完成,可能每几秒钟更新一次-我在这里说的是大话,因为对于较小的尺寸,我不会担心开销)。问题是,我可以做出妥协,每20分钟更新一次城市人口,这既不会伤害用户,也不会伤害数据库。我并不是想说你错了,我只是需要更好地理解这一点。加比,当人口更新时,增长率是否因为所有者或其他人所做的事情而改变?如果是,则在执行该操作时更新数据库。但是如果人口继续以这种速度增长,不管玩家是否在场,那么你就不想更新数据库中的人口。当你需要它的时候,它可以随时计算出来。对于静态增长率,(currentPop=popFromDatabase+(rateOfGrowth*(serverTime-timeOfLastUpdate)))。如果它是指数型的,你可以编写一个递归函数或使用一些适当的数学函数。事实上,人口是以固定的速度增长的,用户可以“雇佣”人,所以人口减少了。这个公式听起来很好。我想我会用这个。当前的人数将类似于费率*时间自加总人数这看起来很有趣,我会试试。