2011-05-07 78 views
4

來自更多'傳統' C++背景更多地用於處理低級API,而不是類似於flash.display API。如何避免flash.display閃爍

我的問題是相當原始的,但我的搜索沒有找到解決方案。

如何避免顯示API中的屏幕撕裂/閃爍? 即使像60 fps這樣高的幀速率,我也會遇到一些相當令人討厭的幀間閃爍/撕裂現象。

請看下面的簡單例子,其中Sprite的子元素只是Shape的實例而且從不改變。

private function onEnterFrame(event:Event):void 
{ 
    var t:Number = (getTimer() - time)/1000; 
    time = getTimer(); 

    step(t); 
} 

private function step(t:Number):void { 
    var speed:Number = 100; 

    for (var i:uint = 0; i < numChildren; i++){    
     getChildAt(i).x += speed * t; 
     getChildAt(i).y += speed * t; 
    } 
} 

然而,因爲所有人都能夠做到看似流暢的快的動畫我有點困惑的是如何真正做到這一點,因爲它基本上看起來像一個同步問題。

+2

http://stackoverflow.com/questions/989471/vsync-in-flex-flash-as3 – jedierikb 2011-05-07 11:15:12

回答

1

首先:你讓你的CPU工作比必要的更難,25/30 fps應該做一個流暢的動畫,所以你只能以這個速度調用step。在更新x的精靈位置之前,y只有在它們發生變化時纔會更改和更新。

讓你的循環儘可能緊湊:把numChildren(方法調用)從循環中取出。使速度變爲int而不是數字(更快)

看看精靈:他們是否具有透明度?透明度是一個性能殺手,因爲Flash必須繪製每一幀的所有圖層。我可以進一步優化它們,例如使它們儘可能小,而不會丟失質量(如果您使用的是更大的圖像,則會縮小到精靈大小)。

+0

是的,這些優化是愚蠢的,只有那些應該真正重要的是混合和亞像素精度我會給你那些。無論如何,沒有人真正處理這個問題,這是撕裂。 – 2011-05-08 04:18:14

0

我見過wmode參數對動畫平滑度有很大影響。同樣的swf在獨立播放器和不同wmode的html頁面中表現不同。經過一些測試後,我更喜歡wmode =「直接」 - 它提供了最流暢的運動,甚至比「gpu」更好。

用ActionScript的一些監視工具(例如Stats)很高興看到您的真實fps。如果它仍然很高,你仍然看到生澀的動作,這是wmode問題。 60 fps比30好,如果你沒有性能限制,爲什麼不使用它。

+0

在張貼ofc之前是否使用Mr.Doobs Stats進行基準測試。實際的swf和上面發佈的例子一樣簡單。問題不在於性能,但是無法同步幀的事實會在另一個產生撕裂的幀的中間被覆蓋。 – 2011-05-08 04:14:22

+1

我沒有說性能是這裏的問題,我只是看到同樣的swf播放順利或生澀,這取決於wmode。即使是獨立的Flash Player也不是性能最好的環境。 – alxx 2011-05-08 10:23:49