delay
简介
延迟执行计时器
一个批量超时定时器,可以触发一个未来时间点内一系列函数在既定相对时间执行
既可以直接使用pkg.delay静态对象,也可以通过new_object创建delay对象实例使用
delay里包含两个计时器:
基于时间轮盘的计时器,接口函数为init_delay/invoke_delay
基于最小堆的计时器,接口函数为init_delay2/invoke_delay2
组件接口
delay.gs
函数原型 | 函数作用 |
---|---|
void init_delay(float max_duration, float frame_duration, float warn_execute_seconds = 0) | 初始化延迟时间和延迟精度,根据延迟精 度将延迟时间划分为若干轮询时间片,同一个轮询时间片内的事件执行的先后顺序跟注册顺序有关。 |
void set_delay_speed(int speed) | 设置延迟倍速,按speed设置的倍速推进延迟事件 |
void delay_invoke(float seconds, function func) | 设置在未来某个时间要触发的事件(函数) |
void init_delay2(float warn_execute_seconds = 0) | 初始化基于最小堆的计时器 |
void delay_invoke2(float seconds, function func) | 定时在指定时长后执行函数(无时长限制,基于最小堆实现的计时器,和delay_invoke2配对) |
类
TimeWheel
时间轮盘
成员变量
变量名 | 类型 | 初始值 | 须初始化 | 描述 |
---|---|---|---|---|
name | string | nil | 可选 | 名称 |
max_duration | int | 0 | 可选 | 所有帧时长总和(单位:毫秒) |
frame_duration | int | 0 | 可选 | 每帧时长(单位:毫秒) |
slots | array | nil | 可选 | 时间刻度数组 |
slot_size | int | 0 | 可选 | |
time_func | function | nil | 可选 | 获取当前时间的函数 |
co | coroutine | nil | 可选 | 调度协程 |
running | bool | false | 可选 | |
execute_warn_ms | int | 0 | 可选 | 执行耗时警告(update的执行间隔,单位:毫秒) |
last_slot_index | int | -1 | 可选 | 运行时 |
running_slot_index | int | -1 | 可选 |
成员方法
函数原型 | 函数作用 |
---|---|
string desc() | 获取描述文本 |
void schedule(float seconds, function func) | 添加到指定的时间刻度上 |
bool step_slot(int target_slot_index) | 步进执行下一刻度 |
void update() | 更新一次 |
void start() | 启动调度协程 |
void stop() | 停止调度协程 |
MinHeapTimer
基于最小堆实现的计时器
成员变 量
变量名 | 类型 | 初始值 | 须初始化 | 描述 |
---|---|---|---|---|
name | string | nil | 可选 | 名称 |
heap | array | nil | 可选 | 最小堆 |
time_func | function | nil | 可选 | 时间函数 |
co | coroutine | nil | 可选 | 启动状态 |
running | bool | false | 可选 | |
execute_warn_ms | int | 0 | 可选 | 执行耗时警告(update的执行间隔,单位:毫秒) |
semaphore | sync_object | nil | 可选 | 信号量 |
成员方法
函数原型 | 函数作用 |
---|---|
string desc() | 获取描述文本 |
void schedule(float seconds, function func) | 增加一个在指定时间执行的任务 |
array try_pop_from_heap() | 从最小堆中弹出已经到达执行时间的最小值 |
void start() | 启动 |
void stop() | 停止 |
样例
import pkg.delay;
// 使用时间轮盘计时器
delay=>init_delay(10f, 0.1f);
// 1秒后执行
delay=>delay_invoke(1f, () {
printf("dealy: 1 seconds\n");
});
// 使用最小堆计时器
delay=>init_delay2();
// 1秒后执行
delay=>delay_invoke2(1f, () {
printf("dealy2: 1 seconds\n");
});