我正在创建一个基于浏览器的MMO,它有基于时间的事件:I.E。建筑物的建造需要23个小时。
我可以在我的MySQL数据库中记录它,然后使用cron脚本或watch
(this question was immensely helpful)循环遍历事件表(或等效)。
似乎有一个普遍的共识,我可以:
(1)每秒为一个处理事件及其相关触发器的脚本运行一个cron作业。
(2)每分钟运行一次cron作业,每秒循环一次,处理事件及其相关触发器的59次迭代。
(3)使用watch
每秒运行一个php脚本。
基本上,一旦事件完成,脚本将处理一些触发器,其范围从更改状态,更新数据库,触发在最近事件之后排队的其他“事件”等等。
我最担心的是每秒有超过10,000个事件和触发器进行处理的可能性。我可以使用哪些策略来避免性能问题?这些是所有解决方案,还是有更好的替代方案?
示例事件:
Construction of Building A - 00:43:21
快进2601秒并执行以下触发器:
Place Building A on map at Location x,y
Update resource total given by building
Start timer on next building in the queue
Construction of Building B - 02:10:49
更好地解释:在游戏的早期阶段,这些事件将需要5分钟到一个小时。在游戏的后期阶段,这些事件将间隔数百小时。我需要实时处理这些事件,因为它们会影响游戏的其他方面(例如资源结构改善每小时给出的资源量)。因此,无论用户是否处于活动状态,这些事件都需要由服务器处理。理论脚本将检查过期事件,然后根据事件运行与所述事件到期相关的其他几种方法。
答案 0 :(得分:2)
https://github.com/prggmr/prggmr
听起来像一个事件库可能会对你有很大帮助,
您可以在prggmr中编写一个简单的间隔,用于拾取将来需要发生的事件并将其注册到事件中,而不是尝试使用“全能”来监控将来发生的所有事件。发动机在那时发出信号。
以下内容可能有效,
prggmr\interval(function(){
$query = mysql_query("SELECT event, when FROM events");
while($event = mysql_fetch_assoc($query)) {
prggmr\setTimeout(function() use ($event){
prggmr\signal($event['event']);
}, $event['when']);
}
// What this would do is look for any events that require signaling in the
// in the future such as a building construction and signal it when the
// given amount of time in milliseconds has run
}, 3600);
// This simply tells the engine to run the function every minute
要运行此代码,请将其存储在event_detect.php
中prggmr event_detect.php
您通常希望让其他应用程序管理该进程,例如runit。
通过这种方法,您可以构建可以作为已注册的“信号处理程序”进入您的应用程序的所有事件,并在后台运行实际的游戏引擎,等待并监视事件,因为它们实时发生而没有任何用户相互作用。
我们实际上正在使用这种方法来处理我们正在开发的游戏的类似情况......逻辑上完全不同但非用户交互式事件处理都是相同的。
同样,对于性能,您可以在一秒或更短的时间内轻松处理10,000个事件,具体取决于您的服务器。