2009-09-30 107 views
1

我(仍)試圖解決我的2D Flash遊戲中的一個問題,即我的幀率下降到不可接受的低點。我有以下的成員變量和方法的類:AS3無類型變量效率

protected var value:*; 
public function getValue() :* { 
    return this.value; 
} 

眼下,該方法被調用每幀看似幾百次,我的申請時間2.23%,在該方法中度過。

您認爲我會注意到value是一個類型變量,顯着提升了性能嗎?使這個變量類型將使代碼在整個應用程序中斷,所以我想更確定它會實際上幫助。你已經在使用

Method        Calls Self Time (ms) 
------        ----- -------------- 
[pre-render]      0  2137 (19.68%) 
[reap]        0  727 (6.7%) 
[enterFrameEvent]     0  464 (4.27%) 
[mouseEvent]      0  352 (3.24%) 
[mark]        0  327 (3.01%) 
State.getValue      792356 242 (2.23%) 
[verify]       0  209 (1.93%) 
[render]       0  159 (1.46%) 
CollisionManager.detectCollisions 584  156 (1.44%) 
Entity.updateAllStates    30227 154 (1.42%) 
Entity.getStateValue    392412 143 (1.32%) 
GSVector.set y      156244 141 (1.3%) 
State.update      659738 123 (1.13%) 

回答

4

總之,。強打字是AS3比AS2更快的主要原因之一(因爲在AS2中所有變量都是無類型的,並且每次引用無類型變量Flash時都必須在內部檢查它是什麼類型)。

通常對於這樣的問題,我會對性能調優的缺陷,即架構變化通常比代碼級調優更有效,以及大多數內容如何通過呈現而不是代碼執行產生瓶頸表示懷疑。 ..但在這種情況下,使用類型變量是你應該做的任何事情,因爲它使你的代碼更健壯,更易讀,更容易維護,並且不易出錯。

在AS3中使用untyped變量真的沒有什麼好的理由。花時間做出這樣的改變,即使你看不到性能提高(儘管我認爲你會的),但從長遠來看,它還是會有回報的。

1

考慮:

而且,這裏的性能簡介我的應用程序,通過自我時間排序,害得我懷疑擺在首位這種getValue()方法的前幾名記錄個人資料,你爲什麼不試試看?

Flash遊戲中緩慢的幀率通常不會與代碼相關。嘗試打開「重繪區域」並查看每幀中正在重繪的內容 - 您可能重繪得太多。

關於主題,除非狀態也可以是名稱空間,否則沒有理由使用*。其他一切都從Object繼承。你的國家沒有共同的祖先或界面嗎?

編輯:實際上,現在我想到了,你正在調用getValue一個LOT。假設您每幀調用一次CollisionManager.detectCollisions,則每幀調用getValue 1356次。

如果您在一個方法中多次調用此方法,請嘗試獲取一次值並將其存儲在本地(作用域爲函數)變量中。您甚至可以將該值傳遞給其他方法,以減少此函數的調用次數。

+0

這將需要很多小時才能做出改變,因此我在輪詢SO以查看你的想法:)感謝關於重新繪製的提示! – Kai 2009-09-30 15:04:28

0

如果你可以在調試器下運行它,把你的每幀代碼放在一個平坦的循環中,然後try this

1

首先,您應該使用輸入變量。它可以提高代碼的可讀性,確保類型安全並提高性能。我發現需要使用的唯一情況:*是在編寫集合類時,希望它可以重用於各種不同類型(Adobe引入泛型!)。

調用屬性或函數確實會產生開銷,但如果您將該變量設置爲public並直接訪問它,則它不是很好的OOP,它會提高性能。

我還懷疑別的東西可能會導致幀率下降。由於看起來你正在做某種碰撞檢測,如果你不這樣做,你應該看看四叉樹。四叉樹將區域分割,以便減少檢查衝突的數量。

+0

您應該在集合場景中使用Object。正如我在我的回答中提到的那樣,*僅添加諸如名稱空間之類的東西。 – 2009-10-01 05:44:28

+0

AS3中的Array和Dictionary類似乎都具有*的返回類型,所以我保持它與它們的集合類一致。你可以測試這個對象不能被定義,但Dictionary和Array可以返​​回undefined,所以它們必須返回* – Allan 2009-10-01 07:09:05