《TypeScript图形渲染实战:2D架构设计与实现》 —3.4.2 添加和删除Timer(计时器)
3.4.2 添加和删除Timer(计时器)
接下来看一下如何在Application类中使用Timer类,实现上一节所设定的目标。其中有一条是Application类能够同时触发多个Timer(计时器),这意味着Application类是Timer的容器。并且要用id号来操作计时器,因此需要Application类能够自动生成id号,为Application类增加如下两个成员变量,如下面的代码所示。
public timers : Timer[ ] = [ ] ;
private _timeId : number = -1 ; // id从0 开始是有效id,负数是无效id值
既然Application类是Timer的容器,需要提供在容器中添加和删除某个Timer的方法,先来看一下删除某个Timer的源码。具体代码如下:
// 根据id在timers列表中查找
// 如果找到,则设置timer的enabled为false,并返回true
// 如没找到,返回false
public removeTimer ( id : number ) : boolean {
let found : boolean = false ;
for ( let i = 0 ; i < this . timers . length ; i ++ ) {
if ( this . timers [ i ] . id === id ) {
let timer : Timer = this . timers [ i ] ;
timer . enabled = false ; // 只是enabled设置为false,并没有从数组中删除掉
found = true ;
break ;
}
}
return found ;
}
需要注意的一点是,上述代码并没有真正删除Timer,而是将要删除的Timer的enabled标记为false,这样避免了析构Timer的内存,并且不会调整数组的内容,可以称之为逻辑删除。如果下次又要增加一个新的Timer,会先查找enabled为false的Timer,如果存在,可以重用该Timer,这样又避免了new一个新的Timer对象。
接下来看一下addTimer的代码,具体源码如下:
// 初始化时,timers是空列表
// 为了减少内存析构,在removeTimer时,并不从timers中删除timer,而是设置enabled
为false
// 这样让内存使用量和析构达到相对平衡状态
// 每次添加一个计时器时,先查看timers列表中是否存在可用的timer,有的话,返回该timer
的id号
// 如果没有可用的timer,就重新new一个timer,并设置其id号及其他属性
public addTimer ( callback : TimerCallback , timeout : number = 1.0 ,
onlyOnce : boolean = false ,data : any = undefined ) : number {
let timer : Timer
let found : boolean = false ;
for ( let i = 0 ; i < this . timers . length ; i ++ ) {
let timer : Timer = this . timers [ i ] ;
if ( timer . enabled === false ) {
timer . callback = callback ;
timer . callbackData = data ;
timer . timeout = timeout ;
timer . countdown = timeout ;
timer . enabled = true ;
timer . onlyOnce = onlyOnce ;
return timer . id ;
}
}
// 不存在,就new 一个新的Timer,并设置所有相关属性
timer = new Timer ( callback ) ;
timer . callbackData = data ;
timer . timeout = timeout ;
timer . countdown = timeout ;
timer . enabled = true ;
timer . id = ++ this . _timeId ; // 由于初始化时id为-1,所以前++
timer . onlyOnce = onlyOnce ; //设置是一次回调,还是重复回调
// 添加到timers列表中
this . timers . push ( timer ) ;
// 返回新添加的timer的id号
return timer . id ;
}
addTimer的代码注释比较详细,可以看到Timer容器管理,使用的策略是初始化容器为空,按需增加新的Timer,重用原来的Timer,做到只增不减,重复使用,以达到设计目标的第四条要求:尽量让内存使用与运行效率达到相对平衡。
- 点赞
- 收藏
- 关注作者
评论(0)