版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、hardware acceleration硬件加速hardware acceleration從android 3.0 (api level 11)開始,android 2d渲染管線能更好的支持硬件加速。硬件加速通過gpu執(zhí)行各種繪畫操作。因?yàn)橛布铀傩枰母嗟馁Y源,所以你的app需要更多的ram。開啟硬件加速最簡(jiǎn)單的方法是在整個(gè)應(yīng)用全局設(shè)置。如果應(yīng)用只使用標(biāo)準(zhǔn)的view和drawable,全局設(shè)置不會(huì)產(chǎn)生不利的影響。然而,因?yàn)橛布铀俨恢С炙械?d繪制操作,開啟會(huì)影響一些自定義view或者繪制調(diào)用。問題顯示為不可見的元素、異常,或者錯(cuò)誤渲染像素。為了補(bǔ)救這些,android提供給你選項(xiàng)開
2、啟或者關(guān)閉硬件加速在以下幾個(gè)層面:· application· activity· window· view如果你的應(yīng)用執(zhí)行自定義繪制,開啟硬件加速,測(cè)試應(yīng)用在實(shí)際的硬件設(shè)備上去查找問題??刂朴布铀倌憧梢栽谝韵聦用婵刂朴布铀?#183; application· activity· window· viewapplication 層在你的android manifest文件里,添加以下屬性到<application>標(biāo)簽里,針對(duì)整個(gè)應(yīng)用開啟硬件加速:<application android:hardwa
3、reaccelerated="true" .>activity 層如果整個(gè)應(yīng)用開啟硬件加速表現(xiàn)的不穩(wěn)定,你也可以針對(duì)單個(gè)activity進(jìn)行控制。在activity層開啟或者關(guān)閉硬件加速,你可以使用android:hardwareaccelerated屬性在<activity>標(biāo)簽內(nèi)。下面是單個(gè)activity中關(guān)閉硬件加速的例子: <application android:hardwareaccelerated="true"> <activity . /> <activity android:hardwa
4、reaccelerated="false" /></application> window 層如果你需要更細(xì)致的控制,可以在獲得的window里開啟硬件加速: getwindow().setflags( windowmanager.layoutparams.flag_hardware_accelerated, windowmanager.layoutparams.flag_hardware_accelerated); · 注: 在window層不能取消硬件加速。view 層通過下面代碼,你可以在運(yùn)行時(shí)關(guān)閉硬件加速: myview.setlayer
5、type(view.layer_type_software, null); 注:你不能在view層開啟硬件加速。 view面板有其他方法關(guān)閉硬件加速。更多詳細(xì)內(nèi)容請(qǐng)看view面板。判斷view是否已經(jīng)硬件加速有時(shí)候,知道一個(gè)應(yīng)用當(dāng)前是否硬件加速是非常有用的,尤其像自定義view。這非常有用,當(dāng)你的應(yīng)用做大量的自定義繪制并且不是所有操作都支持新的渲染管道。有兩個(gè)方法查看應(yīng)用是否硬件加速:· view.ishardwareaccelerated() 如果view附屬于硬件加速的窗體,將會(huì)返回true。· canvas.ishardwareaccelerated()
6、160;如果canvas已硬件加速,將會(huì)返回true。如果你一定要在繪制代碼中進(jìn)行這個(gè)查看,請(qǐng)盡可能用canvas.ishardwareaccelerated()代替view.ishardwareaccelerated()。當(dāng)一個(gè)view附屬于硬件加速窗體,它仍可以通過非硬件加速的canvas來繪制。這種情況,在實(shí)例化時(shí),繪制一個(gè)view到bitmap中,為了緩存目的。android繪畫模型當(dāng)開啟硬件加速,新的繪畫模型利用顯示列表在界面上渲染你的應(yīng)用。 為了完全理解顯示列表和對(duì)你的應(yīng)用有怎樣的影響,知道android不通過硬件加速怎么樣繪制view也很重要。下面的篇章闡述基于軟件和基于硬件的繪
7、畫模型?;谲浖睦L畫模型在軟件繪畫模型中,view通過以下兩個(gè)步驟被繪制:· 使層次失效· 繪制層次每當(dāng)應(yīng)用需要更新部分ui時(shí),調(diào)用invalidate()(或者它的變形)在任意需要改變內(nèi)容的view里。這些失效信息被傳播始終在view層,計(jì)算需要重繪的界面區(qū)域。然后,android系統(tǒng)繪制任意view在這些區(qū)域。不幸的是,這種模型有兩個(gè)缺點(diǎn):· 第一,這種模型需要執(zhí)行的大量的代碼在每一次繪畫。比如,如果你的應(yīng)用在按鈕里調(diào)用了invalidate() ,而且這個(gè)按鈕在另外一個(gè)view之上,此時(shí)android系統(tǒng)會(huì)重繪這個(gè)view,即時(shí)它沒有發(fā)生改變。&
8、#183; 第二個(gè)問題是繪畫模型會(huì)隱藏你應(yīng)用的錯(cuò)誤。從android系統(tǒng)開始重繪view,當(dāng)他們與臟區(qū)域融合時(shí),你改變的view的內(nèi)容可能會(huì)被重繪即時(shí)invalidate()沒有被調(diào)用。此時(shí),你依賴于另外一個(gè)view使之失效來達(dá)到合適的反應(yīng)。這個(gè)反應(yīng)會(huì)在任何時(shí)候改變?cè)谀阈薷哪愕膽?yīng)用時(shí)。因此,你需要一直調(diào)用invalidate()在你的自定義view上,無(wú)論你修改數(shù)據(jù)或者影響你view繪畫代碼的聲明。注: android view當(dāng)它的屬性改變時(shí),自動(dòng)調(diào)用invalidate() ,比如背景顏色或者文本框內(nèi)容?;谟布睦L畫模型android仍使用invalidate()和draw()
9、來響應(yīng)界面更新和視圖渲染,不同的是控制當(dāng)前繪制。android系統(tǒng)將他們記錄在顯示列表來代替馬上執(zhí)行繪畫命令,它包含view層繪畫代碼的輸出。另外一個(gè)優(yōu)化是android系統(tǒng)只需對(duì)記錄和更新顯示列表,通過調(diào)用invalidate()將view標(biāo)記為。 還沒失效的view通過重新運(yùn)行之前的記錄顯示列表被重繪。這個(gè)新繪畫模型包括三個(gè)階段:· 1、層失效· 2、記錄更新顯示列表· 3、繪畫顯示列表用此模式,你不能依賴與臟區(qū)域交叉的view來執(zhí)行它的draw() 。為了確保android系統(tǒng)記錄一個(gè)view的顯示列表,你必須調(diào)用invalidate()
10、;。 忘記這么做會(huì)導(dǎo)致視圖看起來一樣,甚至在改變它后。一旦發(fā)生,這個(gè)bug很容易被發(fā)現(xiàn)。使用顯示列表也利于動(dòng)畫增強(qiáng),因?yàn)樵O(shè)置特殊的屬性,像透明度和旋轉(zhuǎn), 不需要使目標(biāo)視圖失效(它自動(dòng)完成)。這個(gè)優(yōu)化也適用于顯示列表的視圖 (你應(yīng)用的任一視圖都硬件加速) 比如,假設(shè)有個(gè)linearlayout在button上有個(gè)listview。linearlayout的顯示列表看上去這樣:drawdisplaylist(listview)drawdisplaylist(button)假設(shè)你現(xiàn)在要改變listview的不透明,在調(diào)用setalpha(0.5f)后,顯示列表變成:savelayeralpha(0.
11、5)drawdisplaylist(listview)restoredrawdisplaylist(button)listview的設(shè)置代碼沒有被執(zhí)行。系統(tǒng)只更新顯示列表中更簡(jiǎn)單的linearlayout。在未開啟硬件加速的應(yīng)用中,列表的繪制代碼在其父親中還會(huì)被執(zhí)行一次。不支持的繪畫操作當(dāng)啟動(dòng)硬件加速, 2d渲染通道支持一般使用的畫布繪畫操作和一些較少使用的操作。所有的繪畫操作被用于渲染程序,默認(rèn)為widget和layout,還有些高級(jí)應(yīng)用比如反光和紋理平鋪也是被支持的。下面是不被硬件加速的操作清單:· canvaso clippath()o clipregion()o drawpi
12、cture()o , int, int, android.graphics.path, float, float, android.graphics.paint) drawtextonpath()o int, float, int, float, int, int, int, short, int, int, android.graphics.paint) drawvertices()· painto setlineartext()o setmaskfilter()o setrasterizer()· xfermodeso avoidxfermodeo pixelxorxf
13、ermode另外, 有些操作在硬件加速開啟后會(huì)發(fā)生變化:· canvaso cliprect() : xor, difference and reversedifference clip modes are ignored. 3d transforms do not apply to the clip rectangleint, int, float, int, int, int, android.graphics.paint) drawbitmapmesh() : colors array is ignored· painto setdither()
14、: ignoredo setfilterbitmap() : filtering is always ono float, float, int) setshadowlayer() : works with text only· porterduffxfermodeo porterduff.mode.darken will be equivalent to src_over when blending against the framebuffer.o porterduff.mode.lighten will be equi
15、valent to src_over when blending against the framebuffer.o porterduff.mode.overlay will be equivalent to src_over when blending against the framebuffer.· composeshader(鄭州北大青鳥o composeshader can only contain shaders of different types (a bitmapshader and a
16、 lineargradient for instance, but not two instances of bitmapshader )o composeshader cannot contain a composeshader如果你的應(yīng)用受缺失屬性和限制的影響,你可以關(guān)閉硬件加速,在你受影響的部分調(diào)用android.graphics.paint) setlayertype(view.layer_type_software, null) 。這個(gè)方法, 你仍可以利用硬件加速其他任一地方。查看controlling hardw
17、are acceleration得到關(guān)于硬件加速的更多信息。view 層在android的不同版本, view已經(jīng)有能力渲染進(jìn)入屏幕緩存區(qū)內(nèi),無(wú)論是view的繪制緩存,還是使用android.graphics.paint, int) canvas.savelayer()。屏幕緩存,或?qū)?有多種用途。你可以使用他們獲得更好的性能,當(dāng)動(dòng)畫組合視圖或者需要應(yīng)用復(fù)合效應(yīng)。比如,你可以使用canvas.savelayer()來實(shí)現(xiàn)消退效果來臨時(shí)渲染一個(gè)view進(jìn)入層,然后使用opacity factor合成到界面。android 3.0 (api level 11)開始,你有更多的控制通過android
18、.graphics.paint) view.setlayertype()方法,怎樣或者什么時(shí)候使用layers。這個(gè)api有2個(gè)參數(shù):layer的類型和可選的paint對(duì)象,它闡明layer怎么樣合成。 你可以使用paint參數(shù)使用濾色鏡,特殊的混合模式,或者設(shè)置為不透明。view可以使用三種layer類型的其中一種:· layer_type_none:被一般渲染并且不會(huì)被進(jìn)入屏幕緩存。這是默認(rèn)行為。· layer_type_hardware:由硬件渲染到硬件紋理,如果應(yīng)用開啟硬件加速。如果未開啟, 就同layer_type_software。· layer_ty
19、pe_software:由軟件渲染到位圖。the type of layer you use depends on your goal:· performance: 由硬件渲染到硬件紋理,一旦view被渲染到layer,它的繪圖代碼不會(huì)被執(zhí)行直到調(diào)用invalidate()。有些動(dòng)畫,像透明度動(dòng)畫,直接放入layer,由gpu完成非常有效率。· visual effects:使用硬件或者軟件layer類型和paint,對(duì)view應(yīng)用特殊的視覺處理。比如,你使用colormatrixcolorfilter繪制一個(gè)view為黑色或者白色。· compatibility
20、:使用軟件layer類型促使view軟件渲染。如果硬件加速的,有著渲染問題, 這是一個(gè)簡(jiǎn)單的方法來繞過限制的硬件渲染管道。(計(jì)算機(jī)學(xué)校view層和動(dòng)畫開啟硬件加速,硬件層提供提供更快的和更平滑的動(dòng)畫效果。當(dāng)有很多繪圖操作時(shí),動(dòng)畫每秒60幀不是一直能保持的。硬件層可以減輕這個(gè),通過渲染為硬件紋理。硬件紋理可以優(yōu)化view,不再需要視圖不斷重繪本身。當(dāng)你調(diào)用invalidate()或者改變view屬性時(shí),view才會(huì)重繪。如果動(dòng)畫顯示的不夠平滑,考慮開啟硬件層在你使用的view。當(dāng)view進(jìn)入后臺(tái)硬件層,層被混合到界面,view的屬性被控制。設(shè)置這些屬性很有效果,因?yàn)樗麄儾恍枰獀iew失效或者重繪
21、。以下屬性作用于混合層。 通過setter測(cè)試屬性,獲得最優(yōu)效果:· alpha: 改變層透明度· x, y, translationx, translationy: 改變層位置· scalex, scaley: 改變層大小· rotation, rotationx, rotationy: 改變層的三維定位· pivotx, pivoty: 改變層的轉(zhuǎn)換源當(dāng)view被作為objectanimator啟用時(shí),這些屬性被使用其他名字。如果你想使用這些屬性,請(qǐng)調(diào)用適當(dāng)?shù)膕etter或者getter。比如,為了改變alpha屬性,調(diào)用setalpha(
22、) 。下面的代碼片段展示了最有效的方法旋轉(zhuǎn)viewiew在3d的y軸上: view.setlayertype(view.layer_type_hardware, null);objectanimator.offloat(view, "rotationy", 180).start(); 因?yàn)橛布酉拿襟w資源,強(qiáng)烈介意你只在持續(xù)動(dòng)畫時(shí)開啟,并且在動(dòng)畫結(jié)束時(shí)關(guān)閉。你可以使用animation listeners完成: view.setlayertype(view.layer_type_hardware, null);objectanimator animator = objectanimator.offloat(view, "rot
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 39800.8-2024個(gè)體防護(hù)裝備配備規(guī)范第8部分:船舶
- 2025年度床墊行業(yè)展會(huì)參展商采購(gòu)合同3篇
- 2024版航天器發(fā)射與數(shù)據(jù)服務(wù)合同
- 2024版臨時(shí)工合同協(xié)議書范文
- 2024年軟件開發(fā)購(gòu)銷合同
- 個(gè)人借款協(xié)議模板2024專業(yè)版版B版
- 二零二五版二手房買賣合同公證服務(wù)合同規(guī)范與執(zhí)行2篇
- 2024版股權(quán)激勵(lì)合同2篇
- 二零二五版房屋買賣更名與配套設(shè)施移交協(xié)議3篇
- 二零二五年度環(huán)保項(xiàng)目墊資合同范本2篇
- 2024-2025學(xué)年成都高新區(qū)七上數(shù)學(xué)期末考試試卷【含答案】
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2025年浙江杭州市西湖區(qū)專職社區(qū)招聘85人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《數(shù)學(xué)廣角-優(yōu)化》說課稿-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)人教版
- “懂你”(原題+解題+范文+話題+技巧+閱讀類素材)-2025年中考語(yǔ)文一輪復(fù)習(xí)之寫作
- 2025年景觀照明項(xiàng)目可行性分析報(bào)告
- 2025年江蘇南京地鐵集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2025年度愛讀書學(xué)長(zhǎng)參與的讀書項(xiàng)目投資合同
- 電力系統(tǒng)分析答案(吳俊勇)(已修訂)
- 化學(xué)-河北省金太陽(yáng)質(zhì)檢聯(lián)盟2024-2025學(xué)年高三上學(xué)期12月第三次聯(lián)考試題和答案
- 期末復(fù)習(xí)試題(試題)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué) 北師大版
評(píng)論
0/150
提交評(píng)論