2011-04-15 67 views
1

以下是我的問題:我有一些由循環修改的顯示對象,並且我希望Flash在每個循環結束時只顯示一幀。循環的持續時間可能不可預測地變化,因此恆定的幀速率不會這樣做。在Flash中停止呈現w/ActionScript 3

我發現了一種hack-ish方式,在每個循環結束時使用帶有0ms定時器的updateAfterEvent渲染一幀。現在我想阻止Flash在循環中渲染幀:這是浪費時間和資源,併產生奇怪的閃爍效果。將幀速率設置爲0將是一個簡單的解決方案,但stage.frameRate的最小值爲0.01。

問題1:有沒有辦法正確停止標準渲染循環? 解決方法不會被視爲有效的答案,因爲我目前正在做的是一個非常好的解決方法(每100秒1幀可以忍受)。

問題2:有沒有比updateAfterEvent更好的方法來強制渲染?

哎呀,我忘記了文明。早上好/下午好,請提前致謝。

+0

能否請您提供一些代碼,瞭解詳細信息您的問題。我認爲你的問題是關於Flex驗證生命週期(我的意思是`invalidateDisplayList()`等),但不知道。 – Constantiner 2011-04-15 17:03:09

回答

1

使用updateAfterEvent在下一次計劃的渲染更新之前強制渲染沒有任何問題,但是您的浪費計時器是不可取的(太多的函數調用)。相反,在循環結束時分派你自己的渲染事件,監聽它,然後updateAfterEvent()。這就是說,如果我們正在談論的是for,while等..循環,你不應該在循環中看到渲染的東西。 Flash在同步代碼執行期間不會呈現。那部分讓我想知道你的代碼中究竟發生了什麼。

+0

「在同步代碼執行期間不會呈現Flash」 嗯,我可以向你保證,即使不使用updateAfterEvents,Flash也會呈現我的顯示對象。它必須在代碼執行期間執行,因爲它是一個長時間連續執行的循環(是的,一個while循環)。我想Flash會暫停代碼執行來渲染,但它在循環的任何一點都會這樣做(我稱之爲「在循環中間」)。 感謝關於派遣我自己的活動的建議,現在看起來很乾淨。 – Grimy 2011-04-15 17:45:33

1

有很多不同的方法可以解決這個問題,雖然這在整體設計上似乎是一個問題,而不是Flash中的限制。我認爲很長一段時間的循環往往是一個壞主意....如果你需要完全控制,我會脫離屏幕渲染一切,而不是將當前對象附加到DisplayList。這需要將所有內容添加到未連接的精靈,然後在需要時進行繪製。這裏的缺點是你不會得到任何mouseevent/keyboardevent。

的樣子:

var bmp:BitmapData = new BitmapData(800,600,true); 
var container:Sprite = new Sprite(); 

// add all your display objects to the container 

stage.addChild(new Bitmap(bmp)) 

// render loop 
for each (var dsp:DisplayObject in objects) { 
    // stuff 
} 

// clear our bitmap 
bmp.fillRect(bmp.rect, 0); 
bmp.draw(someContainer);