【问题标题】:Most efficient way of tracking player skill upgrades跟踪玩家技能升级的最有效方式
【发布时间】:2018-09-06 07:50:16
【问题描述】:

到目前为止,我已经研究了两种在游戏中持续跟踪玩家属性技能的不同方法。这些主要是概念性的,除了我想出的线程选项/找到了一个例子。

案例:

独自开发网页游戏。地理政治模拟器,但与其他我不会透露的地方相比有一点扭曲。

我正在使用 Flask 和 SQLAlchemy 的组合,我已经为其编写了路由,并且模板动态扩展到了基础中。

目前在本地以开发模式运行它,目的是将其置于基于云的 Linux vm 上的 WSGI 和反向代理(如 Nginx)之后。

关于玩家属性机制 - 玩家将提交一个帖子请求,其中将指定一些信息。首先我们想知道哪个技能、智力、耐力等。接下来我们需要知道哪个玩家,但是所有这些都会自动生成,我们可以使用 Flask-LoginManager 来获取当前用户,以及我们漂亮的 user_loader 装饰器和函数。我们可以使用它提供的用户ID来查询它的其余部分,即玩家是什么级别。我们可以指定用于决定稍后以秒为单位增加等待时间的数学运算。

选项;

选项 1:

根据我的一位同事的建议。允许数据库管理技能的时间安排。当用户提交表单时,我们将创建一个新表来保存技能升级信息。我们记下用户提交表单的时间,并将当前技能水平乘以 X 时间量,然后将两条数据都放入数据库中。然后我们创建一个新的进程来管理这个表的不断检查。使用 timedelta,我们可以检查自提交表单以来经过的时间是否等于或大于玩家必须等待升级完成的时间。

选项 2:

导入线程并创建一个类,该类需要与 init 提供的 abovr 相同的信息,然后只需使用 time.sleep X 时间,然后触发升级并在完成后终止线程。

我希望这一切都有意义。我还没有写,因为我不确定哪种方法最有效。

我正在寻找最具可扩展性的解决方案(即使它不是此处列出的选项),但也是实用的或对我的技能跟踪机制概念的改进。

我愿意在包中添加另一个库,但我真的不想这样做。

【问题讨论】:

  • 添加一个线程的问题是,如果进程被中断,它将永远不会完成,而且负载平衡非常糟糕。另一方面,将信息输入到具有一定触发时间的数据库中,并且已修复并完成。然后,执行任务计划以定期扫描数据库以查找符合更新时间标准的项目,并根据该标准对这些条目执行新操作。如果任务丢失或处理错误,它将在下一次定期运行中修复。调查芹菜...

标签: python python-3.x sqlite flask-sqlalchemy flask-login


【解决方案1】:

我会稍微扩展一下我的评论:

在可扩展性方面:

  • 如果升级过程变得很长怎么办?几小时还是几天?
  • 如果您有很多用户怎么办
  • 如果人们在不同时间断开和重新连接到会话怎么办?

希望很明显,您无法使用选项 2 确保稳健的流程。线程和等待会给服务器带来持续且潜在的限制负载,如果服务器出现故障,所有这些线程都可能丢失。

在健壮性方面:

另一方面,如果您将所有信息记录到数据库中,则您可以交叉检查任何项目的状态并执行某种形式的任务调度程序认为必要的升级/降级操作。这使您可以确保字符状态始终与您期望的一致。而且您只需要一个进程定期扫描数据库并对标记为升级的所有打开行执行操作。

如果您愿意,您也可以完全避免使用全局任务调度程序。当用户在站点上执行活动时,可以在后台运行一个小任务(作为一种装饰器),检查升级状态,如果时间合适,则执行 DB 活动,否则就过去了。但是,与上面的计划任务相反,用户需要积极参与会话才能确保发生这种情况。

【讨论】:

  • 这里的有趣点。可在开发 Flask 服务器上正确测试。我发现在使用自定义线程运行函数时它是相当准确的,该函数专门执行我想要的计时器经过。我可以使用这种方法轻松运行 100 个单独的线程,打印 60 的模数,并在最后将更改提交到数据库。不过,我一定会在周末调查你的建议,看看我得到了什么样的表现和结果。
  • 继续您的建议。我相信我会选择数据库管理选项。不幸的是,我需要这是“活动或非活动”会话,例如无论用户当前是否已连接或登录等,计时器都必须继续。先生,当之无愧的接受答案,谢谢您的时间!
  • 我认为在数据库中存储“激活时间”比使用计时器更容易。例如,如果升级在午夜激活并延迟 4 小时,则激活时间为凌晨 4 点。然后,您的所有调度程序或定期检查程序需要做的就是评估当前的 UTC 时间是否大于凌晨 4 点,如果是,则升级用户。这与用户或会话完全解耦,它只是在操作数据库属性。
  • 更好的是,您可以有一个 pending_upgrades 表,该表有效地列出了一组尚未应用的升级。当作业找到符合时间检查有效条件的作业时,它会将升级应用到关联用户并删除该待处理作业
  • 好吧,我将添加两个新表。伪模式:tblname - Skilltracker,id 和 userid 作为用户 id 的外键,time.time 中提交的表单,然后我们决定乘以 6 级升级的时间是 120 秒乘以 6 = 720 秒所以我们将它设置在一个列中,并将其添加到上一个时间以在另一个列中进行比较和转换,最后我们有活动或非活动的布尔列。我们有两个进程,一个处理时间比较。另一个清理“待处理”表并将它们移动到历史表。
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多