深入理解Flash Player重繪

2021-05-22 20:30:47 字數 3126 閱讀 7899

深入理解flash player重繪

2010- 03- 14 published by youyee under 前端技術, 技術分享

flash player 會以swf內容的幀頻速度來重新整理需要變化的內容,而這個重新整理的過程,我們通常稱為「重繪(redraw)」,相信即便是初級的菜鳥也知道,只要使用的是 debug版本的flash player, 右鍵選單裡就會有「show redraw regions (顯示重繪區域)」 這個選項,當此選項開啟的時候,我們就能清楚地看到此刻場景內被重繪的區域。

那麼什麼情況下會發生重繪呢?

1、最常見的是情況就是舞台上的可視元件在形狀、位置、狀態(alpha, scale...)發生改變的時候會觸發flash player 的重繪。

2、當乙個displayobject的層級(childindex)發生改變的時候也會導致重繪。

3、當你將乙個sprite / movieclip 的buttonmode 設定為 true 的時候,即便是單幀動畫,重繪會在mouseevent.mouse_down的時候觸發。又或者你對displayobject設定層級的時候,即便 displayobject的層級沒有發生改變,也會使得 flash player對此顯示物件進行重繪。

既然重繪是為了能夠將顯示內容進行更新,那麼乙個flash應用程式就不可避免的要觸發重繪。而重繪卻是效能消耗的主要根源,乙個有經驗的flash開發 人員寫出的flash應用,其效能可能70% - 90%(甚至更高)是消耗在重繪上,那麼提高flash應用程式的執行效率和減少重繪有著莫大的關係。

要減少重繪,首先我們需要對單位每幀重繪大小這個概念進行量化:重繪的大小應該取決於數量和面積。數量取決(但不是完全取決)於可視範圍內的需要更新的顯 示物件的數量,假設場景上有兩個閃爍的小圓點並且寬和高都為20,那麼重繪的數量為3,而重繪的總面積就為: 20 * 20 * 3 = 1200 (平方畫素)。

簡單的看看上面的公式是不是覺得重繪面積的計算很容易呢?那麼繼續估計下下面這個情況的重繪面積是多少:

如果你計算的結果是: 20 * 20 * 6 = 2400 (平方畫素),那麼恭喜你,答錯了...

根據上面的介紹,重繪的大小理應就是重繪的數量 * 單個區域的面積,可是為什麼說這個情況就錯呢?讓我們看看問題究竟出在什麼地方:

讓人覺得奇怪的地方出現了,重繪區域的數量依舊是3,而面積卻增大了不少,按照圖上給出的座標資訊,我們不難算出,總重繪面積的大小為:

20 * (70 - 20 + 20) * 3 = 4200 (平方畫素),比起預先估算的 2400 (平方畫素)整整大了 75%!

或許從這個地方開始,大家就開始覺得困惑了。的確,flash player的重繪面積並沒有按照我們之前的設想那樣來計算,但是依舊能找到一些規律,仔細來看以下幾種況:

如果你夠細心,應該不難看出每次 flash player 重繪的區域不會超過3個,即便舞台上有多於三個的顯示物件需要被重繪,flash player 會將其中的兩個或者多個集合(根據位置來判斷)在一起,然後重繪在乙個大區域裡面,至此,我們暫時可以將上面兩個重繪法則命名為三 區域法則就近合併法則,通過總結出來的這兩個法則,我們就能更加容易地理解flash player 重繪的機制,以及解釋在日常除錯中遇到的一些重繪現象了。比如qq牧場裡幾個靠得比較近得小動物被放在乙個區域裡面重繪,而有些動物則不然,被單獨重繪。

當我們了解了重繪機制後,那麼接下來就應該進一步去了解如何避免多餘的重繪,下面列舉的方法可能大部分都是被大家所熟悉的。

1、當乙個帶有動畫效果的displayobject在不顯示的時候,不僅僅是將其 visible 屬性設定為 false, 因為重繪依舊會進行,這裡你可以選擇暫停掉動畫,又或者利用removechild(displayobject) 直接將此物件移除出顯示列表。

2、不出現在可視範圍內外觀變化的顯示物件其實是不會發生重繪的,這點相信是flash本身做了優化,也就是說我的stage.stagewidth 和 stage.stageheight 都為200的情況下,乙個處在舞台上的變化的顯示物體,座標為(200, 200) 寬高都為10,此時flash player重繪內容並不會包括此物件,新版本的flash player 甚至在瀏覽器視窗最小化的時候會關閉掉所有的重繪,這個時候你往往會發現cpu佔用率驟降,但是應用程式依舊在執行。

3、在設定displayobject的層級的時候請先做乙個判斷:

if

(mycontainer.getchildindex

(mychild) != 0

)

運氣好的話,這個判斷最高能帶來200%以上的效率提公升。

4、當你的sprite / movieclip 設定 cacheasbitmap = true 這個屬性的時候,當此顯示物件內很小的乙個區域(甚至是被遮蓋著的物體)發生變化,會導致整個sprite / movieclip重繪。

5、盡量確保活動的顯示內容在非可見區域被暫停活動或者乾脆直接移除出顯示列表,這裡提到的不可視區域不僅僅是舞台外不可見的,還包括舞台內被其他物體遮 蓋住的顯示物件。

正如之前提到的,重繪是flash player效能消耗的主要大戶,所以去優化減小重繪區域面積,減少不必要的重繪操作次數,往往能夠帶來比較大的效能優化回報。

深入理解Flash Player的安全沙箱

最近有許多朋友對沙箱問題有疑問.可以看看這個演講 概要 flash player的策略以及為什麼flash player要強制執行這些策略。個人簡介 李文磊,技術社群組織riameeting 的負責人,adobe community champion成員。也是adobe devnet的約稿人,曾在a...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...