What have you found for these years?

2007-08-31

Timer(setInterval) && ENTER_FRAME(onEnterFrame)

在 ActionScript 中,要讓一個物體定期執行某些事情,大致上有兩種做法,
當然,就是標題上這兩種。前者是 time based, 後者是 frame based.
以往我都是使用 onEnterFrame, 以 frame based animation 來說,
這種做法非常直覺,不過他有兩個很大的缺點:

1. 很難算時間,要用 FPS 去算才行。至於真實時間?抓不到,要靠別的方式。
2. 如果有兩者以上的行為,該怎麼辦?如某物體同時往上也同時往右,全部寫在
同一個 function 中嗎?行為多怎麼辦?其中一個行為改變怎麼辦?設 flag?

第一個問題還是小問題,因為都選擇了 frame based 的方式,時間其實通常
不是那麼重要,差不多就可以了。第二個問題就真的是很嚴重的問題了,這在
碰到二維迴圈展開時會變得非常嚴重,寫起來不只是彆手彆腳,非常恐怖。

在 as2 中,要使用 frame based 的做法,最簡單的方式就是對 onEnterFrame
賦值。如果有 Loki(或 ludy? ccc)的話,靠著 chain 可能還算容易,
沒有的話就真的是很煩。但在 as3 中,一律統一使用 event dispatcher 的做法,
也就是說,其實註冊多個 ENTER_FRAME 事件就可以了。沒搞錯的話,其實
as2 應該也可以這樣做才對,只是在 as3 中統一了做法。

至於 Timer 和 setInterval 呢?setInterval 可能是從 java-script
繼承而來的,簡單地說就是定時會被喚起。優點當然是算時間非常容易,但是缺點
其實還滿多的。

1. thread-safety?
2. CPU 被拖慢時,時間變得非常不準,有關係嗎?

好像只有兩個問題,我也沒碰過 thread-safety 的問題,但是總覺得會有,
而這個有問題的話,就是天大的難題了。至於第二點,時間不準了,用 timer 有意義?

所以雖然 Timer/setInterval 應該是比 ENTER_FRAME 方便得多,
我覺得大部份的情況還是應該使用 ENTER_FRAME, 可以少掉很多可能的問題。
這在遊戲中尤其是如此,太多 critical 的問題需要考量。不過一些比較簡單的東西,
我想還是可以用 Timer/setInterval 去做,例如真正的 FPS 報告,用
ENTER_FRAME + getTimer 的方式計算產生,一些和 domain 無關,或是
可以「非常肯定絕對不會」delay 的狀況,例如運算極少也沒什麼圖形的 flash.
因為如果一 delay 了,還真不敢想像狀況會變多慘,再加上要用 flash 跑出
會 delay 的程式,高達八成啊 XD

當然小小的程式就都在例外就是了。

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0