2013-05-09 48 views
1

假設我們在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 ...

...或不是?我說的是否有缺陷?

+1

我相信,事件是在每個幀週期的早期處理 - 而不是接近尾聲(即之前的屏幕更新)。見http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/ – 2013-05-09 18:34:30

回答

5

輸入框架是生命週期的開始。

enter-frame

Display object lifecycle

  1. 事件類型的事件Event.ENTER_FRAME分派的子顯示對象執行
  2. 事件從孩子顯示分派的事件類型Event.ADDED的對象
  3. 構造代碼事件類型的事件210從孩子顯示分派對象
  4. 事件的事件類型Event.FRAME_CONSTRUCTED的分派
  5. MovieClip的幀動作的執行
  6. 兒童影片剪輯的幀動作將被執行
  7. 事件的事件類型Event.EXIT_FRAME的分派的事件類型Event.RENDER
  8. 事件派出
  9. 事件類型Event.REMOVED事件類別從兒童展示對象派發
  10. 事件前夕nt類型Event.REMOVED_FROM_STAGE從兒童顯示對象派發

你所描述的通常被稱爲彈性跑道,其中大量代碼執行可能會延遲幀渲染。

elastic-racetrack

frame-rate

相關問題