国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 辦公 > Flash > 正文

詳細(xì)剖析Flash Player重繪

2020-07-17 13:15:29
字體:
供稿:網(wǎng)友
Flash Player 會以SWF內(nèi)容的幀頻速度來刷新需要變化的內(nèi)容,而這個刷新的過程,我們通常稱為“重繪(redraw)”,相信即便是初級的菜鳥也知道,只要使用的是Debug版本的Flash Player, 右鍵菜單里就會有“Show Redraw Regions (顯示重繪區(qū)域)” 這個選項(xiàng),當(dāng)此選項(xiàng)打開的時(shí)候,我們就能清楚地看到此刻場景內(nèi)被重繪的區(qū)域。



那么什么情況下會發(fā)生重繪呢?
1、最常見的是情況就是舞臺上的可視組件在形狀、位置、狀態(tài)(alpha, scale...)發(fā)生改變的時(shí)候會觸發(fā)Flash Player 的重繪。
2、當(dāng)一個DisplayObject的層級(ChildIndex)發(fā)生改變的時(shí)候也會導(dǎo)致重繪。
3、當(dāng)你將一個Sprite / MovieClip 的buttonMode 設(shè)置為 true 的時(shí)候,即便是單幀動畫,重繪會在MouseEvent.MOUSE_DOWN的時(shí)候觸發(fā)。又或者你對DisplayObject設(shè)置層級的時(shí)候,即便DisplayObject的層級沒有發(fā)生改變,也會使得 Flash Player對此顯示對象進(jìn)行重繪。
既然重繪是為了能夠?qū)@示內(nèi)容進(jìn)行更新,那么一個Flash應(yīng)用程序就不可避免的要觸發(fā)重繪。而重繪卻是性能消耗的主要根源,一個有經(jīng)驗(yàn)的Flash開發(fā)人員寫出的Flash應(yīng)用,其性能可能70% - 90%(甚至更高)是消耗在重繪上,那么提高Flash應(yīng)用程序的運(yùn)行效率和減少重繪有著莫大的關(guān)系。
要減少重繪,首先我們需要對單位每幀重繪大小這個概念進(jìn)行量化:重繪的大小應(yīng)該取決于數(shù)量和面積。數(shù)量取決(但不是完全取決)于可視范圍內(nèi)的需要更新的顯示對象的數(shù)量,假設(shè)場景上有兩個閃爍的小圓點(diǎn)并且寬和高都為20,那么重繪的數(shù)量為3,而重繪的總面積就為: 20 * 20 * 3 = 1200 (平方像素)。



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

如果你計(jì)算的結(jié)果是: 20 * 20 * 6 = 2400 (平方像素),那么恭喜你,答錯了...
根據(jù)上面的介紹,重繪的大小理應(yīng)就是重繪的數(shù)量 * 單個區(qū)域的面積,可是為什么說這個情況就錯呢?讓我們看看問題究竟出在什么地方:

讓人覺得奇怪的地方出現(xiàn)了,重繪區(qū)域的數(shù)量依舊是3,而面積卻增大了不少,按照圖上給出的坐標(biāo)信息,我們不難算出,總重繪面積的大小為:
20 * (70 - 20 + 20) * 3 = 4200 (平方像素),比起預(yù)先估算的 2400 (平方像素)整整大了 75%!
或許從這個地方開始,大家就開始覺得困惑了。的確,F(xiàn)lash Player的重繪面積并沒有按照我們之前的設(shè)想那樣來計(jì)算,但是依舊能找到一些規(guī)律,仔細(xì)來看以下幾種況:

如果你夠細(xì)心,應(yīng)該不難看出每次 Flash Player 重繪的區(qū)域不會超過3個,即便舞臺上有多于三個的顯示對象需要被重繪,F(xiàn)lash Player 會將其中的兩個或者多個集合(根據(jù)位置來判斷)在一起,然后重繪在一個大區(qū)域里面,至此,我們暫時(shí)可以將上面兩個重繪法則命名為三區(qū)域法則就近合并法則,通過總結(jié)出來的這兩個法則,我們就能更加容易地理解Flash Player 重繪的機(jī)制,以及解釋在日常調(diào)試中遇到的一些重繪現(xiàn)象了。比如QQ牧場里幾個靠得比較近得小動物被放在一個區(qū)域里面重繪,而有些動物則不然,被單獨(dú)重繪。
當(dāng)我們了解了重繪機(jī)制后,那么接下來就應(yīng)該進(jìn)一步去了解如何避免多余的重繪,下面列舉的方法可能大部分都是被大家所熟悉的。
1、當(dāng)一個帶有動畫效果的DisplayObject在不顯示的時(shí)候,不僅僅是將其 visible 屬性設(shè)置為 false, 因?yàn)橹乩L依舊會進(jìn)行,這里你可以選擇暫停掉動畫,又或者利用removeChild(displayObject) 直接將此對象移除出顯示列表。
2、不出現(xiàn)在可視范圍內(nèi)外觀變化的顯示對象其實(shí)是不會發(fā)生重繪的,這點(diǎn)相信是Flash本身做了優(yōu)化,也就是說我的Stage.stageWidth 和 Stage.stageHeight 都為200的情況下,一個處在舞臺上的變化的顯示物體,坐標(biāo)為(200, 200) 寬高都為10,此時(shí)Flash Player重繪內(nèi)容并不會包括此對象,新版本的Flash Player 甚至在瀏覽器窗口最小化的時(shí)候會關(guān)閉掉所有的重繪,這個時(shí)候你往往會發(fā)現(xiàn)CPU占用率驟降,但是應(yīng)用程序依舊在運(yùn)行。
3、在設(shè)置DisplayObject的層級的時(shí)候請先做一個判斷: if(myContainer.getChildIndex(myChild)!=0)
{
myContainer.setChildIndex(myChild,0);
}
運(yùn)氣好的話,這個判斷最高能帶來200%以上的效率提升。
4、當(dāng)你的Sprite / MovieClip 設(shè)置 cacheAsBitmap = true 這個屬性的時(shí)候,當(dāng)此顯示對象內(nèi)很小的一個區(qū)域(甚至是被遮蓋著的物體)發(fā)生變化,會導(dǎo)致整個Sprite / MovieClip重繪。
5、盡量確保活動的顯示內(nèi)容在非可見區(qū)域被暫停活動或者干脆直接移除出顯示列表,這里提到的不可視區(qū)域不僅僅是舞臺外不可見的,還包括舞臺內(nèi)被其他物體遮蓋住的顯示對象。正如之前提到的,重繪是Flash Player性能消耗的主要大戶,所以去優(yōu)化減小重繪區(qū)域面積,減少不必要的重繪操作次數(shù),往往能夠帶來比較大的性能優(yōu)化回報(bào)。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大同县| 英超| 乌兰察布市| 温州市| 光山县| 临泽县| 建阳市| 张掖市| 沙湾县| 黄石市| 景德镇市| 冕宁县| 扶余县| 汝南县| 界首市| 葫芦岛市| 宁国市| 措勤县| 治县。| 阿拉善右旗| 龙井市| 连州市| 梨树县| 天台县| 周口市| 百色市| 江孜县| 新巴尔虎右旗| 都兰县| 兴安县| 汤阴县| 通州市| 枞阳县| 杭锦后旗| 保靖县| 兴安盟| 安阳市| 上犹县| 台北县| 同仁县| 佛冈县|