2008-09-26 46 views
1

今天我遇到了這個話題,同時調查了一件很奇怪的事情。在我們的Flex應用程序中執行某些操作可能導致渲染幀的數量從12fps到30fps:加載的動畫開始高速播放,GUI開始鎖定。Flex發佈事件屏幕更新

由於我在Flex/Flash上​​讀到的所有內容都提到了「幀速率限制在頂級應用程序中設置的幀率」,看起來這些額外渲染可能發生的唯一方式是由於某些原因導致它們的事件(對舞臺的幀速率沒有程序上的改變可以在任何地方完成)。因爲它只發生在我將更新邏輯放在ENTER_FRAME處理程序中時,我試圖找出可能發生的情況,這顯然導致Flex渲染瘋狂。

假設:東西在我的更新功能被觸發即時屏幕更新,這引發了另一個立即ENTER_FRAME,這意味着我的更新循環被調用,從而引發另一即時屏幕更新,...

我們的Flex組件在我們的GUI中使用,如果這是一個因素。我不知道下一步該去哪裏。

澄清

  • 當我說的事情加快,有 兩種方式這表現。
  • 首先,我的ENTER_FRAME處理程序獲得更多地調用 。
  • 其次,一個 加載Flash SWF與循環 動畫內置突然加速 高達te點它看起來很愚蠢。
  • 我沒有使用updateAfterEvent,我只有 發現這個問題時存在研究 這個問題。顯然,Sprite子類 上的一些 事件會自動調用此函數,如果這是根本原因,我不知道 。
  • 我根本沒有對渲染做任何直接的討論。背景動畫自動播放,因爲他們有內置的CS3製作時間表,我們所有的更新功能所做的是改變的DisplayObject位置或添加/刪除等

更新: 我添加了一個標籤,我的應用程序打印stage.frameRate,並在某些時候發現,它突然從12變爲1000(允許的最大值)。儘管在我的ENTER_FRAME處理程序中添加一行以重置它並不是什麼大的幫助。 此外,即使這樣做,渲染也都搞砸了。某些操作(如提高警報彈出窗口)使其全部恢復生機。 不幸的是,我無法查看Stage類的源以在setter屬性上設置斷點。

這對Flex加載「設置爲1000fps」的事情非常有趣。我們有幾個Flex應用程序都提供了一個通用接口。主應用程序負責通過SWFLoader類根據需要加載這些模塊。但是,加載過程已經考慮到了延遲加載......當SWF加載時,我們等待SystemManager中的APPLICATION_COMPLETE。一旦收到,不應該完成申請嗎?

回答

1

我不清楚的一件事 - 你是否看到實際的屏幕刷新比發佈的幀率更快?還是你的動畫移動得更快,但屏幕刷新沒有改變? (即,它用於每秒移動10個像素,但是現在它的移動速度比這更快,無論屏幕的繪製頻率如何)。

檢查此操作的簡單方法是嘗試以1 fps發佈您的內容。應該清楚屏幕是否每秒刷新一次,但動畫元素的移動頻率比這更頻繁,或者屏幕是否實際更新頻率更高。

如果是後者,您是否在代碼中使用了任何updateAfterEvent()方法?這會導致實際的屏幕刷新速度比發佈的幀速率更快。但它不應該影響ENTER_FRAME事件。你應該仍然只能得到每幀更新中的一個。

或者,您正在爲Sprite等等設置動畫效果,還是以Flex組件的形式實現它們,並試圖用invalidate()方法和RENDER事件等來重繪它們?

如果您可以在問題中澄清一些這些問題,答案可能會更清楚。謝謝...

1

感謝您的澄清。如果一個帶有動畫的加載剪輯(我假設你的意思是一個幀動畫)正在加速,那麼這聽起來像是在改變你的播放幀率,而不是其他可能發生的事情。隨着中說這不是我見過前突然出現一個問題,但我認爲有一些事情你可以試試應該縮小問題的所在:

  1. 你不妨嘗試描繪出加速期間加入stage.frameRate。據推測,應該要改變你的幀率,但既然這將解釋你的問題,你可以排除。

  2. 嘗試刪除儘可能多的GUI組件,並查看問題是否仍然存在,如果可能在沒有它們的情況下觸發問題。

  3. 如果可行的話,您可以嘗試一個完整性檢查,即將您的遊戲的一些內容複製到新項目中並在其中嘗試。有時候會發生類似這樣的神祕問題,因爲有些課程或SWC正在導入某個人人都忘記的地方。

  4. 你可以嘗試從不同的事件驅動你的代碼。例如,據我所知,駕駛它從Event.EXIT_FRAMEEvent.FRAME_CONSTRUCTED應該看起來相同,但如果它不,那麼這是一個暗示。或者,你可以嘗試從鍵盤事件或MouseEvent.MOUSE_MOVE之類的東西開車。如果更新發生,即使你沒有發射事件,你也會知道別的東西正在驅動事件循環之外的事情。

無論如何,這些都是我想嘗試的。希望你追蹤它...

4

Flex在Flex組件的「階段性實例化」期間將幀速率設置爲1000,這隻發生在Flex swf的初始加載期間。這使得它可以非常快速地構建所有組件。

您是否在等待Flex應用程序完全加載和構建?在使用Flex內容之前,您應該等待FlexEvent.CREATION_COMPLETE。

如果您希望引用此occcurs的位置,請查看Flex LayoutManager類,第326行(使用Flex SDK 3.0。194161),在二傳手的物業usePhasedInstantiation。

更新:

APPLICATION_COMPLETE應該已經爲你披上初始負載。

這實際上是在組件直接從MXML創建時發生的。所以還有其他一些案例需要尋找。你在使用任何中繼器嗎?您是否使用任何按需建造子項的導航容器?

+0

啊,我還沒有想出任何MXML組件的APPLICATION_COMPLETE。這當然與我所看到的有關。對此我需要進一步澄清,但將其作爲一個新問題提出是有道理的。 – MidnightGun 2008-09-30 20:06:39