AS3里的禁区:Timer

本文通过一个Flex项目的实际案例,分析了外包团队在使用Timer时常见的不当做法及其潜在问题,并提出了正确的使用建议。

因为项目,接手了一个公司外包flex项目的跟进,BUG很多,慢慢理清程序逻辑,发现外包的团队,都有一个使用Timer的不良习惯,从而导致了该项目从开发初期,就已经埋好了很多地雷。

我会从项目里抽出部分代码说明,最后以自己的经验,做个总结,什么时候用TIMER,什么时候不该用TIMER

	/**
		 * 
		 * @param event
		 * 
		 */
		protected function resizeHandler(event:ResizeEvent):void
		{
			var timer:Timer = new Timer(50,1);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE,function():void
			{
				fitDisplay();
			});
			timer.start();
			
		}

这里的fitDisplay(); 就是用户处理屏幕缩放后,界面元素的尺寸处理

这里大家可以很显然看到,有一个50毫秒的延时,至于为什么用50毫秒,估计外包的公司的那几个程序员,做过了一些测试,可能他们的开发机,上限制值20毫秒就能有处理结果,他们为了保险,用了50毫秒,就臆断了客户机可以胜任了此程序的运行。

很显然这是不负责任的写法,程序员的职责是什么?就是编写能稳定运行功能的代码。为什么这次要重点讲到这部分,是因为TIMER,一直都有不少人在重复犯相同的错误,而这次的外包项目,我从代码的注释和编码风格,大概知道了是2个老手带3个新手,而这个团队5个人都有乱语,甚至滥用TIMER的习惯。


好了,吐槽完毕,认真的解析下这个TIMER的官方说法:

Timer 类是 Flash Player 计时器的接口。 可以创建新的 Timer 对象,以便按指定的时间顺序运行代码。 使用 start() 方法来启动计时器。 为 timer 事件添加事件侦听器,以便将代码设置为按计时器间隔运行。 
可以创建 Timer 对象以运行一次或按指定间隔重复运行,从而按计划执行代码。 取决于 SWF 文件的帧频或 Flash Player 的环境(可用内存及其它因素),Flash Player 会能会按稍有偏差的间隔调度事件。 例如,如果某个 SWF 文件设置为以每秒 10 帧 [fps](也就是 100 毫秒的间隔)的速度播放,但计时器设置为在 80 毫秒时触发事件,则 Flash Player 将按接近于 100 毫秒的间隔触发事件。 大量耗费内存的脚本也可能使事件发生偏差。


官方解释的很清楚,FlashPlayer的虚拟机是以帧频去触发渲染的,而帧频又和电脑硬件等有着必然联系,所以注定了开发者不能以自己或周边几天电脑为判断依据,去随意估值一个延时的时间,再去触发事件,这样会有很多不可预计的现象发生。

还有现在从事FLEX开发的程序员,并不是从flash转型过来,对帧频这个概念比较模糊

上述只是其1的问题,是FP自身的渲染逻辑注定的,其2大量使用TIMER,是程序员自身不负责任的编码习惯。 上述那段代码,其实就是界面初始化后,才能去执行缩放处理,但是界面初始化是有一定的时间差,这个时间差应该通过事件去调度执行缩放处理,而不是妄自的认为给定一个50毫秒就解决的。现在初始化50毫秒上限制可以渲染出来,假如刚好在那个初始阶段,机器有其他吃CPU的软件在突然运行,那50毫秒,甚至500毫秒都可能渲染不出来,那这个缩放处理函数还是会出错,报null值错误。作为程序员,应该是严谨的,多学习事件执行流程对自己开发是多多益善。

说了这么多,就是告诫自己,程序运行执行的逻辑顺序,一定要掌握在自己手中,而不是交给机器,放任不管,这样可以做到心中有数,遇到BUG也知道问题出在哪里。而不是去各种瞎碰,去修改延时时间。

由于给定引用中未涉及android::base::Timer的相关内容,以下是结合专业知识的介绍。 `android::base::Timer` 是 Android 系统中 `base` 库提供的一个用于计时的工具类,其主要功能是方便开发者进行时间测量,例如统计一段代码的执行时间等。 ### 功能介绍 - **计时功能**:可以精确测量从开始计时到停止计时之间所经过的时间,单位通常为毫秒。 - **重置功能**:允许重新开始计时,方便多次测量不同代码段的执行时间。 ### 使用方法 以下是一个简单的示例代码,展示了如何使用 `android::base::Timer`: ```cpp #include <android-base/timer.h> #include <iostream> void someFunction() { // 模拟一些耗时操作 for (int i = 0; i < 1000000; ++i) { // 空循环 } } int main() { android::base::Timer timer; // 开始计时 timer.Start(); // 执行需要计时的函数 someFunction(); // 停止计时并获取经过的时间 double elapsedTime = timer.NowMs(); std::cout << "Function execution time: " << elapsedTime << " ms" << std::endl; return 0; } ``` 在上述代码中,首先包含了 `android-base/timer.h` 头文件,然后创建了一个 `android::base::Timer` 对象。调用 `Start()` 方法开始计时,执行需要计时的函数 `someFunction()`,最后调用 `NowMs()` 方法获取从开始计时到当前所经过的时间(以毫秒为单位)。 ### 代码解释 - `android::base::Timer timer;`:创建一个 `Timer` 对象。 - `timer.Start();`:启动计时器。 - `timer.NowMs();`:获取从启动计时器到调用该方法时所经过的时间,返回值为 `double` 类型,表示毫秒数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值