2011-05-03 48 views
0

我試圖敲掉我的應用程序的一些cpu週期,我想知道最少的cpu密集型方法是執行代碼。flex性能,方法調用或事件

拿這兩個例子。第一個是運行並調用各種方法的輸入框。 第二個是相同的輸入框,但調度事件。

1)這些框架中的其中一個框架可能比其他框架的cpu密集程度低嗎?

2)在第一個例子中,幀必須等到方法1 2和3完成之後,下一幀才能呈現並執行代碼?

3)在第二個例子中,調用方法1 2和方法3的事件是否可以在除調用方法的框架中執行? EG,如果CPU處於壓力之下,它能推遲執行嗎?

public function enterframe(e:Event):void 
{ 
method1(); 
method2(); 
method3(); 
} 

public function enterframe(e:Event):void 
{ 
dispatchEvent(MethodEvent.Test, method1); 
dispatchEvent(MethodEvent.Test, method2); 
dispatchEvent(MethodEvent.Test, method2); 
} 

回答

1

我認爲你可以做的最好的事情就是忘記enterFrame事件。在您的代碼中放置一個Timer,並根據您的確切需要設置延遲。您可以輕鬆體驗巨大的優化。

據我所知enterFrame是連接到fps。所以如果你的電影是30fps的動畫,那麼它將每秒運行30次。

現在,這意味着它更像是一個區間(flash.utils.setInterval)或Timer

因此,您可以看到,enterFrame或多或少是一種設置間隔或間隔類功能的簡單方法。如果你知道你的需求,刷新率和東西,你可以更精確地設置定時器和時間間隔,以獲得巨大的性能提升。

+0

定時器也連接到幀速率。像enterFrame一樣,定時器也只在幀中執行。例如:https://github.com/ethankennerly/regulate – 2013-05-21 14:58:12

1

編輯:因爲我弄糊塗了通過內置的AS3代碼派遣我的第一個答案是不正確的Flash播放器的功能和自定義事件調度的事件。雖然Flash播放器本身是多線程的,但您無法訪問as3中的線程功能。下面是我修改的答案:

1)難道是有可能爲這些 enterframes的一個不那麼CPU密集型 比其他?

那麼,如果你看指令的數量,調度一個事件的指令有更多的指令,直到它實際執行方法中的代碼。它首先必須通過事件監聽器列表,然後在特定對象中查找與給定事件類型相比較的對象。

2)在第一示例執行幀 要等到方法1 2和3 已下一 幀之前完成可以呈現並執行代碼?

是。在第二個例子中發生了同樣的事情。

3)在第二實施例可以在事件 分派到方法1 2和3是在一個比 調用它以外的幀執行 ? EG,如果在壓力下CPU是 可以推遲執行 ?

不,它們是以程序方式執行的。


老答案:

1)難道是有可能爲這些 enterframes之一是CPU不夠密集 比其他?

那麼,如果你看指令的數量,調度一個事件的指令有更多的指令,直到它實際執行方法中的代碼。儘管事件分派爲每個方法創建一個新線程,以便它們同時運行。你花費在那些額外的指令上來調用你將在線程拆分中獲得的方法。因此,如果您在每種方法中都有很多說明,我會說事件派發速度更快。

2)在第一示例執行幀 要等到方法1 2和3 已下一 幀之前完成可以呈現並執行代碼?

是。

3)在第二實施例可以在事件 分派到方法1 2和3是在一個比 調用它以外的幀執行 ? EG,如果在壓力下CPU是 可以推遲執行 ?

由於代碼在單獨的線程中執行和輸入幀繼續之前的第一個取決於有多少指令有在每個方法完成的方法可以被執行多次。

+0

@Ancide。 「_儘管事件分派爲每個方法創建一個新線程,所以它們同時運行」。他們不會同時運行。 – 2011-05-03 20:38:31

+1

等待一分鐘。如果3個線程在彼此之後創建,它們同時運行 – rzetterberg 2011-05-03 20:40:14

+0

從什麼時候閃存運行在多個線程中? – 2011-05-03 20:40:37

1

這是過早優化的經典案例。無論您使用事件驅動方法還是方法調用都應該基於良好的設計實踐,而不是基於哪一種更快。在任何情況下,Flex大多數都是異步的,它使用事件驅動模型和後期概率來維護鬆散的組件耦合和事件鏈接,而您正在尋找的方法不會有助於顯着的性能改進(尤其是cpu週期) 。如果你認爲你的性能不是最佳,我建議你使用Flex Profiler。 (主要是在內存中存儲的部件,減慢Flex應用程序。只要你釋放過時的組件的參考...)

+0

這不是真的不成熟。我一直在研究這個項目一段時間。我認爲除了表演之外它是完整的。在某些機器上運行良好,但在其他機器上,CPU將攀升至50%,瀏覽器將崩潰。我花了時間在剖析器上,但似乎沒有任何額外的對象不應該在那裏。如果在某些機器上運行良好,我是否會在這裏找到想要改進的地方 – dubbeat 2011-05-03 21:04:30

+0

是否沒有提到環境問題。你認爲一般情況下的性能可以得到改善,或者你正試圖在某些機器上調試性能問題......在以後的情況下,你應該看看flash player。 – 2011-05-03 21:13:51

0

看起來,你在dispatchEvent(MethodEvent.Test, method1);誤認爲你應該先使用addEventListener功能。

addEventListener(MethodEvent.Test, method1); 
addEventListener(MethodEvent.Test, method2); 
addEventListener(MethodEvent.Test, method3); 

然後dispatchEvent(MethodEvent.Test);。這兩種變體在性能上沒有顯着差異。調度事件只是調用監聽器數組中的每個函數。所以唯一的性能問題是循環偵聽器數組。