《TypeScript图形渲染实战:2D架构设计与实现》 —3.4.2 添加和删除Timer(计时器)

举报
华章计算机 发表于 2019/12/12 19:38:24 2019/12/12
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第3章,第3.4.2节,作者是步磊峰。

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,做到只增不减,重复使用,以达到设计目标的第四条要求:尽量让内存使用与运行效率达到相对平衡。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。