`

时间效率,Timer 和 EnterFrame 在 FP 10.1 之后测试和建议

    博客分类:
  • Flex
阅读更多

关于Timer还是EnterFrame的选择,一直是很多AS3开发者讨论的话题, 随着10.1即将普及,我这次对10.1的Timer和EnterFrame进行了一次较详细的测试,给大家在他们的选择和使用上做些参考。

注,flashplayer10.1新增了一个当前窗口在非激活状态下会自动降低fps到2fps来节省cpu消耗,这将直接影响靠fps驱动的enterframe的效率和准确性。

测试环境主要以网页下的flash执行效率为主, 分为空运算和重运算,同时运行和分别运行。

FPS为25(大多数应用的默认值), 即40ms间隔,发布统一选择以10.1发布。

为了避免因为频繁trace或频繁写入场景txt受到影响,我设定了间断式的输出结果来保证结果的纯洁。

写了这些实验,对Timer和EnterFrame的使用上有一些建议:

1,EnterFrame是恒定的,稳定的,比较适合用来更新渲染画面,如Tween。 但不适合做异步计算和处理, 如果能保证cpu每帧的计算效率在40ms以内,可以把计算放到enterframe时序中,这样可以稳定25fps,当然,这不包括渲染损耗。

2,Timer在100ms的倍数是很稳定的,pc和mac都能稳定,非100的倍数的值会有两个相差不大的值交替出现。

3,EnterFrame在12、20、30fps都比25fps更稳定,25fps会有两个相差不到大的数值交替出现。

4,EnterFrame在计算时优于Timer。

5,Timer更适合使用异步的长周期来改变数据的状态,并不适合短时间持续更新数据,或是渲染画面。

6,EnterFrame和Timer同样受到非活动创口的fps自动降低的影响。

7,当受到影响时,无法通过判断frameRate==2,使用一个延迟时间,判断出正好500ms的延迟(2fps),并在相应的enterframe中做切换特殊处理,在2fps中要完成原正常fps的渲染结果才能避免渲染的延迟影响。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.text.TextField;
	import flash.utils.getTimer;
	import flash.utils.Timer;
 
	/**
	* ...
	* @author Demon.S
	*/
 
	public class Main extends Sprite
	{
		private var timerDelay:Number;
		private var enterDelay:Number;
		private var txt:TextField;
		private var log:String;
		public function Main():void
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//init
			txt = new TextField();
			txt.width = 500;
			txt.height = 500;
			addChild(txt);
			log = "";
			//test suit
			//  testTimer();
			testEnterFrame();
		}
 
		private function testEnterFrame():void
		{
			stage.frameRate = 25;
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler)
			enterDelay = getTimer();
		}
 
		private function enterFrameHandler(e:Event):void
		{
			//heavyTest();
			var t:int = getTimer() - enterDelay;
			_trace("enter " +t )
 
			if (t == 500) _trace("fp10.1 hidden mode")
			enterDelay = getTimer();
		}
 
		private function timerUpdate(e:TimerEvent):void
		{
			// heavyTest();
			var t:int = getTimer() - timerDelay;
			_trace("timer " + t)
			if (t == 500) _trace("fp10.1 hidden mode")
			timerDelay = getTimer();
		}
 
		private function testTimer():void
		{
			var timer:Timer = new Timer(40);
			timer.addEventListener(TimerEvent.TIMER, timerUpdate)
			timerDelay = getTimer();
			timer.start();
		}
 
		private function _trace(...arguments):void
		{
			//trace.apply(this, arguments);
			log += arguments.join() + "\n";
			if (log.length > 100) {
				txt.appendText(log);
				txt.scrollV = txt.maxScrollV;
				log = "";
			}
		}
 
		private function heavyTest():void
		{
			for (var i:int = 0; i < 1000000 ; i++ ) var a:Array = [];
		}
 
	}
}

 

分享到:
评论

相关推荐

    02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序.rar

    这个"02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序.rar"压缩包包含了一系列针对STC8A8K芯片上所有定时器的测试程序,这些程序对于理解和应用这些定时器功能至关重要。 STC8A8K系列单片机提供了多个定时器,包括...

    C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-22

    C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4...

    C# 使用Timer控件显示当前时间

    在C#编程中,`Timer`控件是一个非常实用的组件,它允许程序在特定间隔内执行指定的任务。本教程将深入探讨如何使用`Timer`控件来显示实时的当前时间。 `Timer`控件是.NET框架中的一个控件,位于System.Windows....

    精确的控制时间间隔Timer

    7. **使用信号量或条件变量**:在多线程环境中,可以利用信号量或条件变量来协调`Timer`线程与其他线程的交互,减少等待和唤醒的时间开销,提高效率。 综上所述,精确控制时间间隔需要深入理解`Timer`的工作原理,...

    enterFrame和timerEvent区别

    在探讨“enterFrame和timerEvent区别”这一主题时,我们首先需要理解这两个概念的基本含义以及它们在Adobe Flash或ActionScript中的应用方式。虽然Flash已经逐渐退出历史舞台,但其所涉及的概念和技术仍然对现代Web...

    c# Timer 中怎么在固定时间和固定周期中调用事件

    ### C# Timer 中怎么在固定时间和固定周期中调用事件 在C#中,`System.Timers.Timer` 和 `System.Windows.Forms.Timer` 是两种常用的定时器类,它们可以帮助我们在固定的时间间隔内执行某些操作。本篇文章将详细...

    異步Timer Timer

    在IT行业中,异步编程是一种重要的技术,它允许程序在等待某个操作完成时继续执行其他任务,从而提高系统的效率和响应性。在这个场景中,"異步Timer Timer"的标题和描述提到了时间管理和异步处理事件的概念,这通常...

    erlang的timer和实现机制

    在Erlang中,`timer`模块是用于处理延时操作和定时任务的关键工具,它提供了丰富的功能,使得开发者能够优雅地处理时间相关的逻辑。 首先,`timer`模块的主要函数包括`tc/1,2,3`(测试调用)、`send_after/3,4`...

    TimerTask与Timer设计时间监控

    本篇文章将深入探讨`TimerTask`和`Timer`的工作原理及其在时间监控中的应用。 `Timer`类是Java.util包中的一个核心类,它提供了计划在将来某一特定时间执行任务的能力。`Timer`类主要负责调度任务,可以创建一个...

    timer_hw.rar_hw_timer

    在IT行业中,硬件定时器(HW Timer)是嵌入式系统和计算机硬件中不可或缺的组件。硬件定时器通常由微控制器或系统级芯片(SoC)中的专用硬件电路实现,用于执行时间相关的任务,如中断服务、周期性操作或者精确计时...

    jquery.timer.js 动态显示时间

    1. 考虑性能:尽管jquery.timer.js效率较高,但频繁更新时间可能会影响页面性能。建议根据实际需求选择合适的更新频率。 2. 兼容性:确保浏览器支持jQuery和javascript,以保证插件的正常运行。 3. 错误处理:在使用...

    Android中定时器Timer和TimerTask的启动,停止,暂停,继续等操作

    下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。 需要注意的问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新...

    加Timer控件 timer1

    在`timer1_Tick`方法中,我们使用`DateTime.Now`获取当前系统时间,并将其格式化为“yyyy-MM-dd hh:mm:ss”的形式,然后将格式化后的字符串赋值给`toolStripStatusLabel3`的`Text`属性,以此来实时更新状态栏上显示...

    WM_TIMER测试示例

    当在应用程序中设置一个计时器后,系统会在指定的时间间隔内向拥有该计时器的窗口发送`WM_TIMER`消息。这个时间间隔可以通过`SetTimer`函数来设定。 计时器有两种类型:非精确计时器(`WM_TIMER`)和精确计时器(` ...

    系统Timer机制,从硬件到操作系统,还有Qemu对timer的模拟

    硬件时钟提供基础的时间基准,主机操作系统管理和调度Timer,而应用程序则通过接口与Timer交互,设置时间、获取时间并处理定时回调或中断。 2. Hardware Timer 硬件Timer是物理设备,它们负责提供准确的时间基准和...

    timer写的一个任务测试类

    前者用于在指定的延迟后执行一次任务,而后者则用于在指定的初始时间和之后的周期内重复执行任务。 `TimerTask`是`Runnable`接口的子类,我们需要自定义这个类的实例来实现实际的任务逻辑。`TimerTask`提供了`run()...

    PB9多Timer事件实例

    通过学习"PB9多Timer事件实例",开发者不仅可以掌握如何在PowerBuilder中有效地使用Timer,还能深入理解事件驱动编程的概念,提升程序设计的灵活性和效率。同时,这个实例也能帮助开发者解决实际项目中涉及定时任务...

    02-Timer0-Timer1-Timer2测试程序_STC15W408AS跑马灯程序_

    在这个项目中,我们将深入探讨如何使用STC15W408AS微控制器通过Timer0和Timer1来实现跑马灯的效果。STC15W408AS是一款基于8051内核的单片机,具有丰富的定时器资源和I/O端口,非常适合这样的应用。 首先,我们需要...

    C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: ...是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事

    Timer和TimerTask的使用

    ### Timer和TimerTask的使用详解 #### 一、引言 `Timer` 和 `TimerTask` 是Java中用于实现定时任务的重要工具。它们提供了一种简单有效的方式来安排任务的执行,既可以一次性执行也可以周期性地执行。这对于实现...

Global site tag (gtag.js) - Google Analytics