2013-10-22 77 views
1

假設我有一系列要按順序執行的動畫。如果我這樣做,我是否創建了一個巨大的調用堆棧,消耗的內存超過了必要的?AS3:按順序調用函數而不創建巨大的調用堆棧

function ch1():void { 
    var someVar:uint; 
    function doThis(); 
    ... 
    ... 
    ch2(); 
} 
function ch2():void { 
    var someOtherVar:String; 
    function doThat(); 
    ... 
    ... 
    ch3(); 
} 
function ch3():void { 
    var evenMoreVar:Number; 
    function doMore(); 
    ... 
    ... 
    ch4(); 
} 

通過這樣做來避免巨大的調用堆棧來調用下一個函數會更好嗎?

function ch1():void { 
    addEventListener("ch1_end",ch2); 
    var someVar:uint; 
    function doThis(); 
    ... 
    ... 
    dispatchEvent(new Event("ch1_end")); 
} 
+0

這是尾巴呼叫優化。如果編譯器不行,你可以自己做。 –

+0

謝謝,我甚至不知道它有一個名字。我想這個問題就變成了,Adobe Flash Pro CS6編譯器是否會調用尾部優化? – BladePoint

+0

如果你的項目變得複雜,你就會陷入地獄之路。開發一些管理這些動畫的類會更聰明。也許是有限狀態機或類似的東西。 – Pier

回答

2

使用事件是一個更好的辦法來對付像你這樣的序列,但在一些簡單的情況下,你可以只延遲每個調用一點,所以你可以肯定他們不會在同一時間運行,並導致凍結您的swf,儘量使用像setTimeout這樣簡單的東西,看看結果,如果不好,那麼你應該嘗試使用你在問題中描述的事件。

var nextCallDelay:Number = 20; // in milliseconds, change it to fit your needs 

function ch1():void { 
    var someVar:uint; 
    function doThis(); 
    ... 
    ... 
    setTimeout(ch2, nextCallDelay); 
} 
function ch2():void { 
    var someOtherVar:String; 
    function doThat(); 
    ... 
    ... 
    setTimeout(ch3, nextCallDelay); 
} 
function ch3():void { 
    var evenMoreVar:Number; 
    function doMore(); 
    ... 
    ... 
    setTimeout(ch4, nextCallDelay); 
} 
0

那麼你如何返回一些東西,所以你沒有那麼多的互連函數?

function ch1():void { 
    return true 
} 

function ch2():void { 
    return true 
} 

function myAnim(){ 
     var ani1 = ch1(); 
     var ani2 = ch2(); 
}