2013-01-05 46 views
0

Flash中可以完全平滑滾動(ActionScript 3)嗎?在下面的測試中,我創建了一個由隨機噪聲組成的位圖,然後定期將它移動到左邊。我沒有在後臺運行繁重的任務。我所尋找的是光滑度,這將是看齊我的Amiga 500從1987年:-)Flash AS3上的平滑滾動

package { 
    import flash.display.*; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    public class Game extends Sprite { 
     var noiseBitmap; 

     public function Game() { 
      var noiseBitmapData = new BitmapData(stage.stageWidth * 3, stage.stageHeight); 
      noiseBitmapData.noise(0, 0, 255, 7, true); 
      noiseBitmap = new Bitmap(noiseBitmapData); 
      addChild(noiseBitmap); 

      var t = new Timer(1000/30, 999999); 
      t.addEventListener("timer", function (e:TimerEvent) { 
       noiseBitmap.x--; 
      }); 
      t.start(); 
     } 
    } 
} 

的「渲染代碼」需要< 1毫秒到我的電腦(2.4GHz的蘋果機)上運行,但仍機芯偶爾會卡住一兩幀,使機芯顯得不平整。

Flash中的FPS設置爲30。我試着用「測試電影」和瀏覽器(Chrome)來運行它。 Target是Flash Player 11.2。我也嘗試調用e.updateAfterEvent()強制重繪。我也玩過將延遲和FPS設置爲稍微不同的值,但沒有改進。

這與not smooth scrolling in AS3不同,因爲我已經使用了BitmapData。我也試着用ENTER_FRAME事件來代替計時器,正如在回答這個問題時所建議的那樣,但它沒有幫助。

+0

幀之間的延遲保持在31-34毫秒之間。 – Bemmu

+0

正如其他地方所回答的那樣,您絕對應該使用ENTER_FRAME而不是定時器。但無論哪種方式,垃圾收集器都可能導致這種急躁行爲。如果您還沒有訪問任何分析工具來診斷您的代碼,Adobe Scout非常值得一看(免費)。 – 2013-01-14 23:43:59

回答

3

使用計時器時,您將不會與幀速率完全同步。正如你所提到的,幀速率有點波動,使得你的計時器有時會在一幀或兩幀之間觸發兩次。爲確保與幀速率保持同步,您應該聽取Event.ENTER_FRAME事件。

一個例子:

this.addEventListener(Event.ENTER_FRAME, updateFrame); 

function updateFrame(e:Event):void { 
    noiseBitmap.x--; 
} 
+0

謝謝,但使用ENTER_FRAME不是一種改進。 – Bemmu

3

我建議你嘗試GreenSock的TweenLite的。它是一個高度優化的引擎,可以通過代碼進行各種補間並可用於AS2和AS3。你可以找到它here

Walkietokyo的解決方案仍然是基於框架的,並不會消除您遇到的問題。而應使用基於時間的動畫(TweenLite實際實現該動畫)。欲瞭解更多信息,請參閱this article