目录

计时器(timer)

概述:

计时器(timer)是服务端常用的功能,是指每隔一定时间进行一次回调的时间间隔计算器,常用于周期性的计算处理(如AI)、延迟处理(如大量的计算时可逐一延迟进行)。几乎每个app的核心模块KBEngine中都有timer计时器相关的部分,比如addTimerdelTimer(在Baseapp和Cellapp上,timer的相关api是在Entity身上)。

API介绍:

addTimer

Entity中的方法:def Entity.addTimer(self, initialOffset, repeatOffset=0.0, userArg=0):
KBEngine中的方法:def KBEngine.addTimer(initialOffset, repeatOffset=0, callbackObj=None):

注册一个定时器,定时器由回调函数onTimer(Entity中)或指定的callbackObj(KBEngine中)触发,回调函数将在”initialOffset”秒后被执行第1次,而后将每间隔”repeatOffset”秒执行1次,可设定一个用户参数”userArg”(仅限integer类型)。

参数

参数名 参数类型 是否必要 介绍
initialOffset float 必须 指定定时器从注册到第一次回调的时间间隔(秒)。
repeatOffset float 可选 指定第一次回调执行后每次执行的时间间隔(秒)。必须用函数delTimer移除定时器,否则它会一直重复下去。值小于等于0将被忽略。
userArg int 可选 指定底层回调”onTimer”时的userArg参数值。
callbackObj function 可选 指定的回调函数对象

返回值

int    返回timer的内部id,这个id可用于delTimer移除定时器。


delTimer

def delTimer(self, id):

用于移除一个注册的定时器,移除后的定时器不再执行。只执行1次的定时器在执行回调后自动移除,不必要使用delTimer移除。如果delTimer函数使用一个无效的id(例如已经移除),将会产生错误。

参数

参数名 参数类型 是否必要 介绍
id int 必须 要移除的定时器id。

返回值

bool    是否成功移除


回调函数onTimer

def onTimer(self, timerHandle, userData):

当一个与此实体关联的定时器触发的时候被调用。一个定时器可以使用addTimer函数添加。

例子:

API手册中已经介绍过一些例子,这里我们做一个复杂一些的。

1. 一个房间游戏的回合时间计时

比如,一款棋牌游戏中,每一个出牌局都是有时间限制的,超出后进会自动随机出一张牌。此时就可以使用Timer来处理。一旦进入某选手的出牌局,就addTimer并保留生成的timerId。如果该选手出牌了,就使用delTimer删除刚才timerId对应的计时器,否则回调onTimer时计算随机出牌,同时结束该出牌局。

2. 刷怪计时器(延迟处理)

我们知道,在mmo rpg中刷怪是常见的方法,特别是在服务器刚启动的时候,许多地图上都需要生成大量的刷怪点(SpawnPoint),而每个刷怪点又会生成许多怪物实体。为了服务器的性能考虑,会把这个过程用计时器做延迟处理,即一定时间间隔内刷固定数量的值,把计算强度平摊到一个稍长的时间范围上。

3. 怪物AI(周期性tick)

怪物的AI需要在怪物“觉醒”时一直tick,根据当前周围的情况进行逻辑判断。这种情况也是使用timer计时器的绝佳情景。


Copyright © 2018 Yolo Technologies. Publication: 2.0-025. Built: 2018-12-07.