⏳ 计时器
概述:
计时器(timer)是服务端常用的功能,是指每隔一定时间进行一次回调的时间间隔计算器,常用于周期性的计算处理(如AI)、延迟处理(如大量的计算时可逐一延迟进行)。几乎每个app的核心模块KBEngine中都有timer计时器相关的部分,比如addTimer
、delTimer
(在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计时器的绝佳情景。