假設我們在Flash中有1 fps的動畫,其中每個幀都有一個運行100 ms的腳本。據我所知,在Flash動畫的工作原理如下:爲什麼在刷新Flash中的屏幕之前出現EnterFrame
0ms: Begin executing Frame 1's frame script
100ms: Finish executing Frame 1's frame script
1000ms: Begin rendering Frame 1's content and frame-script output
1050ms: Finish rendering Frame 1's content and frame-script output
1051ms: Begin executing Frame 2's frame script
1151ms: Finish executing Frame 2's frame script
2000ms: Begin rendering Frame 2's content and frame-script output
2050ms: Finish rendering Frame 2's content and frame-script output
2051ms: Begin executing Frame 3's frame script
2151ms: Finish executing Frame 3's frame script
3000ms: Begin rendering Frame 3's content and frame-script output
3050ms: Finish rendering Frame 3's content and frame-script output
...
這個工作流程是合乎邏輯的,作爲幀腳本正在執行在等待下一個屏幕更新。即使腳本需要長達1000ms的執行時間,渲染也不會延遲,並且仍然會達到1fps。
但是!當從AS3內部編程動畫時,人們經常使用ENTER_FRAME事件,在之前發生下一次屏幕更新。然後,如果我們有需要1000ms的指令來執行,工作流程如下:
0ms: do nothing (waste time!)
1000ms: begin executing instructions in ENTER_FRAME
2000ms: finish executing instructions in ENTER_FRAME
2001ms: Begin rendering Frame 1's content and ENTER_FRAME output
2051ms: Finish rendering Frame 1's content and ENTER_FRAME output
2051ms: do nothing (waste time!), as we have to wait 1000ms from last rendering to current
3000ms: begin executing instructions in ENTER_FRAME (1000ms after last rendering)
4000ms: finish executing instructions in ENTER_FRAME
4001ms: Begin rendering Frame 2's content and ENTER_FRAME output
4051ms: Finish rendering Frame 2's content and ENTER_FRAME output
4051ms: do nothing (waste time!), as we have to wait 1000ms from last rendering to current
5000ms: begin executing instructions in ENTER_FRAME (1000ms after last rendering)
6000ms: finish executing instructions in ENTER_FRAME
6001ms: Begin rendering Frame 2's content and ENTER_FRAME output
6051ms: Finish rendering Frame 2's content and ENTER_FRAME output
...
因此,我們有0.5 fps的,而不是1個FPS!由於ENTER_FRAME發生之前渲染現場,延遲來了。對我來說,如果ENTER_FRAME發生之後渲染場景,爲下一幀渲染做好準備。
這是一個玩具的例子,在現實世界中渲染不會發生在那個完美的時間表,但邏輯是相同的。當有15毫秒的代碼執行每一幀(完全正常的情況),60 fps將變成30 fps ...
...或不是?我說的是否有缺陷?
我相信,事件是在每個幀週期的早期處理 - 而不是接近尾聲(即之前的屏幕更新)。見http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/ – 2013-05-09 18:34:30