教程目录
一 计时器简介
二 计时器实现
三 Demo下载

一 计时器简介
在手机上跑游戏时,可能由于运动物体过多,导致帧频太低,计时不准确。
比如一些倒计时的游戏,可能倒计时30s,变成了35s。
比如iphone运行流畅游戏倒计时60s,实际耗时60s,而android有点儿慢,倒计时60s,实际耗时70s。
比如一些物体运动,每帧移动1像素,60fps,移动60像素,由于卡顿,帧频降低到40fps,那么实际这个物体只移动了40像素。
比如在unity中,有两种帧环FixedUpdate跟Update,Update每帧执行一次,而FixedUpdate固定间隔执行一次.
比如...

所以我写了一个计时器,基于系统时间计时,不受fps影响。

该工具类参考了某位水友的帖子,忘了是哪个贴了,在此感谢一下...

如图,在帧频较低时,egret.Event.ENTER_FRAME和egret.timer计数较低,而DateTimer计数不受fps影响。

二 计时器实现

使用方法和egret.Timer一致

[Actionscript3] 纯文本查看 复制代码
?
1
2
3
var dateTimer:DateTimer = new DateTimer(1000);
dateTimer.addEventListener(egret.TimerEvent.TIMER, this.onDateTimerHandler, this);
dateTimer.start();

DateTimer源码如下

[Actionscript3] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * 根据系统时间的计时器
 * @author chenkai
 * 2016/12/30
 * Example:
 * var dateTimer:DateTimer = new DateTimer(1000);
 * dateTimer.addEventListeners(egret.TimerEvent.TIMER, this.onTimerHandler, this);
 * dateTimer.addEventListeners(egret.TimerEvent.TIMER_COMPLETE, this.onTimerComplete, this);
 * dateTimer.reset();
 * dateTimer.start();
 */
class DateTimer extends egret.EventDispatcher{
    /**以前时间 */
    private previous: number;
    /**当前时间 */
    private curTime: number;
    /**已过去时间 */
    private passTime: number;
    /**累计时间 */
    private accTime: number;
    /**每帧耗时 */
    public delay: number;
    /**当前计数 */
    public currentCount:number;
    /**设置的计时器运行总次数 */
    public repeatCount:number;
     
        public constructor(delay:number,repeatCount:number = 0) {
            super();
            this.delay = delay;
            this.repeatCount = repeatCount;
        }
         
    /**开始计时 */
    public start(){
        this.previous = egret.getTimer();
        this.accTime = 0;
        egret.startTick(this.update, this);
        }
         
    /**重置计时 */
        public reset(){
        this.previous = egret.getTimer();
        this.accTime = 0;
        this.currentCount = 0;
        }
         
    /**停止计时 */
    public stop(){
       egret.stopTick(this.update, this);
        }
         
    /**更新时间 */
    private update():boolean{
        this.curTime = egret.getTimer();
        this.passTime = this.curTime - this.previous;
        this.previous = this.curTime;
        this.accTime += this.passTime;
        while(this.accTime >= this.delay) {
            this.accTime -= this.delay;
            this.currentCount++;
            if(this.repeatCount > 0 && (this.currentCount == this.repeatCount)){
                this.dispatchEvent(new egret.TimerEvent(egret.TimerEvent.TIMER_COMPLETE));
                this.stop();
            }
             
            this.dispatchEvent(new egret.TimerEvent(egret.TimerEvent.TIMER));
        }
        return false;
        }
         
         
}

三 Demo下载

转载于:https://www.cnblogs.com/gamedaybyday/p/9219941.html

【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)相关推荐

  1. 嵌入式Linux系统时间设置

    Linux系统的很多功能都需要读取时间为基础.比如:日志系统需要时间戳以记录log,为后期的问题排查提供支撑:cron服务需要正确的时间设置以支撑周期性.特定时间点执行某个任务:等等.大多数Linux ...

  2. Zabbix监控服务器系统时间

    很多系统管理员会遇到一个问题,服务器系统时间出现偏差,直到业务受到影响才发现.最近我也遇到了这个问题,公司内有很多服务器,而且什么版本的系统都有,没有统一的时间同步源.最近也因为这个问题对桌面虚拟化产 ...

  3. centos7 校正linux系统时间_基于centos7系统部署NTP服务及配置时间定时同步

    概述 linux服务器在提供服务时,要和其他机器进行请求的交互,实际生产环境中,可能因为时间不同步,导致了服务异常. 下面介绍下怎么部署NTP服务来解决这个问题. ps:强烈吐槽下头条这个新排版功能, ...

  4. 某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为 1μs。

    某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为 1μs.在 T 时刻就绪队列中有 3 个进程 P1.P2 和 P3,其在就绪队列中的等待时间.需要的 CPU 时 ...

  5. 计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远程部署

    计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远 ...

  6. GDI绘制时钟效果,与系统时间保持同步,基于Winform

    2019独角兽企业重金招聘Python工程师标准>>> 这是直接在Winform的基础上进行绘制的.接下来,我对时钟进行了封装,封装成一个名为CSharpQuartz的类,效果如下: ...

  7. 欧陆战争5设备系统时间与服务器时间不一致,欧陆战争5怎么调回时间?欧陆战争5帝国调回时间的教程...

    在欧洲战争5的游戏中,调整时间可谓是一个非常好用的bug.但是很多玩家却不知道如何合理的利用调整时间来给自己增加实力,今天我们就来给大家介绍一下,欧陆战争5怎么调回时间? 首先调时间,其实就是让真正的 ...

  8. STM32 基础系列教程 5 – 系统定时器

    前言 学习stm32 systime的使用,用基本定时器产生定时1ms定时中断,用于参生1ms系统时钟节拍,并实现将1ms 节拍改成500us 或其它时间功能.并实产生的时间节拍为机基准实现控制LED ...

  9. Visual Studio图形调试器详细使用教程(基于DirectX11)

    前言 对于DirectX程序开发者来说,学会使用Visual Studio Graphics Debugger(图形调试器)可以帮助你全面了解渲染管线绑定的资源和运行状态,从而确认问题所在.现在就以我 ...

最新文章

  1. 如何快速研究透一篇 Paper 并提出有价值的问题?
  2. 一个word文档中,多个表格的批量调整(根据窗口调整表格和添加表格水平线)...
  3. jointable 能加多个字段吗_Excel函数Countif、Countifs超级实用技巧,你真的都掌握吗?...
  4. cf 1511 D. Min Cost String
  5. react学习(37)----获取子组件得实例
  6. 马哥学习李洋个人笔记之-----正则表达式
  7. 力扣1512.好数对的数目
  8. [查找问题] 例5.1 找x
  9. 2018.8.2 python中is和==的区别
  10. C-Free5.0破解码
  11. SQL Server 2005数据库可疑、置疑修复方法
  12. WebRTC 什么是source,track, sink?什么是AudioSink,VideoSink,MediaSink?
  13. Spring @ResponseBody未生效,无法返回json数据 前端页面显示404
  14. eve手游php,[Murky Army]EVE无烬星河PVP入门————小队战战术及队伍配置(
  15. 用程序实现基本计算器功能
  16. iOS永久签名不掉签工具,轻松签超详使用教程
  17. Android的Bitmap图片压缩与内存的关系
  18. Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-1.5.0-gcj-4.5/lib/tools.jar 求解
  19. JS 实现十大排序算法
  20. PVCBOT【21号】挑战者--人形机甲战士

热门文章

  1. 正则表达式(开源框架)
  2. 关于target=标签
  3. iOS- UITableView could not hold the selected row after reload
  4. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
  5. css背景渐变的技巧与方法
  6. OpenCV 1.x 2.x 编程简介(矩阵/图像/视频的基本读写操作)
  7. 中文分词器分词效果的评测方法
  8. CentOS7下搭建Nginx+PHP7的安装配置
  9. 只用一招,让你Maven依赖下载速度快如闪电
  10. Vcenter一次性将服务器四个网卡从端口组迁移到分布式交换机的方法