最近我發現有幾件事可以做到大規模減慢Flex應用程序的速度。其中一件事就是使用很多嵌套的佈局容器。另一件非常有問題的事情是使用批次的相對位置和大小。Flex渲染性能
我知道在佈局元素可以顯示之前必須完成大量的計算。我不明白的是爲什麼渲染一直都在進行。在佈局中存在一定的複雜度時,即使佈局沒有變化,您的CPU使用率也始終爲100%。
這是爲什麼?我能做些什麼(不重做整個佈局)?
非常感謝!
最近我發現有幾件事可以做到大規模減慢Flex應用程序的速度。其中一件事就是使用很多嵌套的佈局容器。另一件非常有問題的事情是使用批次的相對位置和大小。Flex渲染性能
我知道在佈局元素可以顯示之前必須完成大量的計算。我不明白的是爲什麼渲染一直都在進行。在佈局中存在一定的複雜度時,即使佈局沒有變化,您的CPU使用率也始終爲100%。
這是爲什麼?我能做些什麼(不重做整個佈局)?
非常感謝!
最後我發現了我們的應用程序究竟是什麼問題!
問題不在於我們使用了大量的嵌套佈局容器。我發現我們使用的第三方組件將一個事件監聽器附加到了ENTER_FRAME事件。不幸的是,這個組件沒有正確關閉,所以事件監聽器永遠不會被刪除。這個事件觸發的一件事是對invalidateDisplayList()的調用。我發現ENTER_FRAME事件經常發生(我仍然不知道爲什麼會發生這種情況),並且因爲整個佈局一遍又一遍地重新計算。由於我們佈局的嵌套結構,這是一件非常耗時的事情,因此CPU變得非常忙碌!
我可以通過向組件添加一些額外的代碼來解決此問題,該代碼可以在不再需要的情況下正確刪除事件偵聽器。其結果是,應用程序現在在空閒模式下不需要任何CPU功率。萬歲!
是第三部分組件是商業產品?如果是這樣,你應該向他們提交一個錯誤報告。如果是這樣,請讓我們知道哪些產品和您的解決方案的細節,以防其他人遇到問題。 〜感謝。最後搞清楚你的問題。 – invertedSpear 2010-02-22 20:08:36
不,第三方組件不公開。它只是爲我們正在開發的應用程序開發的一個組件。 – zlajo 2010-02-22 21:37:54
的確,嵌套容器確實會減慢速度,但我還沒有能夠將CPU使用率提高到100%。框架只應在調用invalidateDisplayList()後重新計算組件的佈局。調用此計劃將調用updateDisplayList,其中計算容器的佈局。因此,組件子項的顯示列表也會失效。
除了自己做,displayList可以由框架使各種原因失效。例如,它在invalidateProperties()後總是失效。這可能是因爲您偶爾會無意中使某些高級容器的顯示列表無效,從而將其傳播給子級。
你有任何可以分享的代碼嗎?你在運行什麼樣的系統?
你是什麼意思「invalidateProperties()」?您是否在談論PropertyChangeEvents可觸發的方法? – zlajo 2009-12-21 10:53:35
對不起,花了一點時間,聖誕節和所有這一切。無論如何,invalidateProperties使框架計劃調用commitProperties,就像invalidateDisplayList的情況一樣。這是組件知道它的一些值已經發生變化的一種內部方式,它不僅需要更新它的外觀,還需要它的行爲方式 - 在行爲發生變化之後,Flex假定外觀必須改變,從而調用updateDisplayList。屬性可以失效,即。當設置dataProviders等。 PropertyChangeEvents與數據綁定有關,與此無關。 – tehmou 2009-12-22 19:21:53
任何其他解決方案,然後重構您的佈局,而不是使用許多嵌套元素意味着改變Adobe框架的工作方式,你不想這樣做! 我的建議雖然可能是痛苦的,但改變你的視圖組件,儘量使用絕對大小和位置,不要嵌套太多元素。 使用嵌套組件的瓶頸的原因是無效函數有兩種方法,首先從更改的組件到根的樹,然後從根到所有嵌套的元素,這是什麼把你的CPU。
嘗試在您的應用上運行Flex Builder Profiler,看看性能問題的根本原因是什麼。 – 2009-12-21 13:54:19