Flash中的计时器
在AS3開發中,計時器應該是最常見的組件了,關于各種計時方法也是層出不窮,一般來說,各種方法都會滿足我們的需要,但是我們還是會遇到一個讓人頭痛的問題,那就是精度。
由于Flash是解釋運行,限于FP的虛擬機有諸多限制,所以不要指望能和C++那樣擁有可以到達毫秒級的高精度計時,甚至連微秒級別的計時也不容樂觀,我們今天就來探討一下常用的計時方法和他們的差別。
1 Event.ENTERFRAME事件
????????這個應該是最常見的了,幾乎很多計時都用這個事件。它表示幀頻,也就是說,每秒鐘播放多少個幀,最新的CS5版本默認是24幀,早期的版本默認是12幀,這個是由于為了彌補和提高早期動畫不流暢的問題而提高了幀率,事實也證明,人眼對于每秒30幀以上的畫面切換就不會再感到閃爍,對于Flash,24幀就足夠了
????????Event.ENTERFRAME事件雖然好用,但是在FP10.1版本以后,Adobe為了解決Flash內存占用的問題,做了一個優化:那就是如果當前的Flash,包括FP中本地和WEB頁面上的動畫,沒有處于焦點狀態,也就是說有其他窗口遮蓋了Flash,那么它會自動降頻,降為2幀/秒來運行,這樣的話計時就大大不準了,這種方法不太實用時間類的計時。
2 Timer
????????Timer真是讓人既愛又恨,不可否認的是,Timer的確是一個非常方便的計時器組件,但是他的精度實在是太低了,1個小時中間我見過的誤差能有幾分鐘,我們也可以測試一下Timer的精度:
view source print? 01.var?TestTime:Timer = new?Timer(1000); 02.TestTime.addEventListener(TimerEvent.TIMER,OnTimer); 03.TestTime.start(); 04.? 05.? 06.private?function?OnTimer(e:TimerEvent){ 07.var?tick = getTimer(); 08.trace(tick); 09.}????????getTimer()是獲得Flash運行到現在的毫秒數,運行上面的代碼我們會發現,每次trace的結果都忽大忽小,按道理說應該是按照一定的固定數字增加才對,但是這個數字并不固定,雖然trace會占用一部分時間,但是總的來說,Timer的精度還是不容樂觀。
3 setInterval()方法
????????這個是按照指定的毫秒數去不斷運行一個方法,但是和Timer差不多,而且setInterval()本身的機制需要Flash不斷的去調用,因此也不是很理想。
4 getTimer()方法
????????有人說用getTimer()來計時,理由是它獲得的是系統所經過的毫秒數,不錯,但是你怎么來調用這個方法呢?還是要在Timer或者ENTERFRAME里調用,俗話說上梁不正下梁歪,就算getTimer再精確,由于調用它的方法不精確,所以也沒有多大意思
5 Tween
????????Tween也可以計時,這個一般人好像并不會用到,但是用Tween來做計時有個明顯的好處就是,他不會受WEB頁面的影響,因為有不少人反映在WEB里播放Flash有的機器快有的慢,如果用Tween來計時就沒有這個問題,具體原因我也說不清,但是我的確用這個方法解決了曾經一個Flash在不同瀏覽器計時不準確的問題。
以上都是常用的計時方法,只能根據需要取舍,如果大家有更好更精確的計時方法也歡迎提出,需要提示一點的是:Timer用的越多效率越低,誤差也越大,不知道FP10.2對于這些問題有沒有實質性的改進。
總結
以上是生活随笔為你收集整理的Flash中的计时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chromium 安装flash pla
- 下一篇: 证书管理机构——CA(Certifica