到目前为止,我已经研究了两种持续跟踪游戏中玩家属性技能的方法。这些主要是概念性的,除了我想出的/找到了一个示例的线程选项。
情况:
独自开发网络游戏。地缘政治模拟器,但与其他地方相比,有些扭曲,我不会透露。
我使用的是Flask和SQLAlchemy的组合,为此我编写了路由,并使模板动态扩展为基础。
当前将其在本地以开发人员模式运行,目的是将其放在基于云的Linux vm上的WSGI和反向代理(如Nginx)后面。
关于玩家属性机制-玩家将提交发布请求,其中将指定一些信息。首先,我们想知道哪个技能,智力,耐力等。接下来,我们需要知道哪个玩家,但是所有这些都会自动生成,我们可以使用Flask-LoginManager通过漂亮的user_loader装饰器和函数来获取当前用户。我们可以使用它提供的用户ID来查询其余部分,即播放器的级别。我们可以指定用于决定稍后等待时间增加的数学运算。
选项;
选项1:
根据我的一位同事的建议。允许数据库管理技能的时间安排。当用户提交表单时,我们将创建一个新表来保存技能升级信息。我们记下用户什么时候提交表单,并且将当前的技能水平乘以X倍的时间,然后将这两个数据都放入数据库中。然后,我们创建一个新过程来管理此表的常量检查。使用timedelta,我们可以检查自提交表单以来经过的时间是否等于或大于玩家必须等待直到升级完成的时间。
选项2:
导入线程并创建一个类,该类期望获得与init上提供的abovr相同的信息,然后只需使用time.sleep X倍的时间,然后触发升级并在线程结束时终止线程。
我希望这一切都有道理。我也没有写任何书,因为我不确定哪种方法最有效。
我正在寻找最具扩展性的解决方案(即使此处未列出此选项),但它还是既实用又对我的技能跟踪机制概念有所改进的解决方案。
我愿意向软件包添加另一个库,但我真的不愿意。
答案 0 :(得分:0)
我将对我的评论进行一些扩展:
希望很明显,您不能使用选项2来确保可靠的过程。线程和等待将对服务器造成持续且潜在的限制负载,如果服务器发生故障,所有这些线程可能会丢失。
另一方面,如果您将所有信息记录到数据库中,则可以进行交叉检查任何项目的状态并执行某种形式的任务计划程序认为必要的升级/降级操作。这样可以确保角色状态始终与您期望的一致。而且,您只需要一个进程即可定期扫描数据库,并对标记为升级的所有未完成行执行操作。
如果愿意,也可以完全避免使用全局任务调度程序。当用户在站点上执行活动时,可能会在后台运行某种任务(作为一种装饰器),以检查升级状态,如果时间合适,则执行DB活动,否则就过去了。但是,与上述预定任务相反,用户需要积极参与会话以确保这种情况发生。