HardwareAcceleration硬件加速_第1頁
HardwareAcceleration硬件加速_第2頁
HardwareAcceleration硬件加速_第3頁
HardwareAcceleration硬件加速_第4頁
HardwareAcceleration硬件加速_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、hardware acceleration硬件加速hardware acceleration從android 3.0 (api level 11)開始,android 2d渲染管線能更好的支持硬件加速。硬件加速通過gpu執(zhí)行各種繪畫操作。因為硬件加速需要消耗更多的資源,所以你的app需要更多的ram。開啟硬件加速最簡單的方法是在整個應用全局設置。如果應用只使用標準的view和drawable,全局設置不會產生不利的影響。然而,因為硬件加速不支持所有的2d繪制操作,開啟會影響一些自定義view或者繪制調用。問題顯示為不可見的元素、異常,或者錯誤渲染像素。為了補救這些,android提供給你選項開

2、啟或者關閉硬件加速在以下幾個層面:· application· activity· window· view如果你的應用執(zhí)行自定義繪制,開啟硬件加速,測試應用在實際的硬件設備上去查找問題??刂朴布铀倌憧梢栽谝韵聦用婵刂朴布铀?#183; application· activity· window· viewapplication 層在你的android manifest文件里,添加以下屬性到<application>標簽里,針對整個應用開啟硬件加速:<application android:hardwa

3、reaccelerated="true" .>activity 層如果整個應用開啟硬件加速表現的不穩(wěn)定,你也可以針對單個activity進行控制。在activity層開啟或者關閉硬件加速,你可以使用android:hardwareaccelerated屬性在<activity>標簽內。下面是單個activity中關閉硬件加速的例子: <application android:hardwareaccelerated="true"> <activity . /> <activity android:hardwa

4、reaccelerated="false" /></application> window 層如果你需要更細致的控制,可以在獲得的window里開啟硬件加速: getwindow().setflags( windowmanager.layoutparams.flag_hardware_accelerated, windowmanager.layoutparams.flag_hardware_accelerated); · 注: 在window層不能取消硬件加速。view 層通過下面代碼,你可以在運行時關閉硬件加速: myview.setlayer

5、type(view.layer_type_software, null); 注:你不能在view層開啟硬件加速。 view面板有其他方法關閉硬件加速。更多詳細內容請看view面板。判斷view是否已經硬件加速有時候,知道一個應用當前是否硬件加速是非常有用的,尤其像自定義view。這非常有用,當你的應用做大量的自定義繪制并且不是所有操作都支持新的渲染管道。有兩個方法查看應用是否硬件加速:· view.ishardwareaccelerated() 如果view附屬于硬件加速的窗體,將會返回true。· canvas.ishardwareaccelerated()&#

6、160;如果canvas已硬件加速,將會返回true。如果你一定要在繪制代碼中進行這個查看,請盡可能用canvas.ishardwareaccelerated()代替view.ishardwareaccelerated()。當一個view附屬于硬件加速窗體,它仍可以通過非硬件加速的canvas來繪制。這種情況,在實例化時,繪制一個view到bitmap中,為了緩存目的。android繪畫模型當開啟硬件加速,新的繪畫模型利用顯示列表在界面上渲染你的應用。 為了完全理解顯示列表和對你的應用有怎樣的影響,知道android不通過硬件加速怎么樣繪制view也很重要。下面的篇章闡述基于軟件和基于硬件的繪

7、畫模型。基于軟件的繪畫模型在軟件繪畫模型中,view通過以下兩個步驟被繪制:· 使層次失效· 繪制層次每當應用需要更新部分ui時,調用invalidate()(或者它的變形)在任意需要改變內容的view里。這些失效信息被傳播始終在view層,計算需要重繪的界面區(qū)域。然后,android系統繪制任意view在這些區(qū)域。不幸的是,這種模型有兩個缺點:· 第一,這種模型需要執(zhí)行的大量的代碼在每一次繪畫。比如,如果你的應用在按鈕里調用了invalidate() ,而且這個按鈕在另外一個view之上,此時android系統會重繪這個view,即時它沒有發(fā)生改變。&

8、#183; 第二個問題是繪畫模型會隱藏你應用的錯誤。從android系統開始重繪view,當他們與臟區(qū)域融合時,你改變的view的內容可能會被重繪即時invalidate()沒有被調用。此時,你依賴于另外一個view使之失效來達到合適的反應。這個反應會在任何時候改變在你修改你的應用時。因此,你需要一直調用invalidate()在你的自定義view上,無論你修改數據或者影響你view繪畫代碼的聲明。注: android view當它的屬性改變時,自動調用invalidate() ,比如背景顏色或者文本框內容?;谟布睦L畫模型android仍使用invalidate()和draw()

9、來響應界面更新和視圖渲染,不同的是控制當前繪制。android系統將他們記錄在顯示列表來代替馬上執(zhí)行繪畫命令,它包含view層繪畫代碼的輸出。另外一個優(yōu)化是android系統只需對記錄和更新顯示列表,通過調用invalidate()將view標記為。 還沒失效的view通過重新運行之前的記錄顯示列表被重繪。這個新繪畫模型包括三個階段:· 1、層失效· 2、記錄更新顯示列表· 3、繪畫顯示列表用此模式,你不能依賴與臟區(qū)域交叉的view來執(zhí)行它的draw() 。為了確保android系統記錄一個view的顯示列表,你必須調用invalidate() 

10、;。 忘記這么做會導致視圖看起來一樣,甚至在改變它后。一旦發(fā)生,這個bug很容易被發(fā)現。使用顯示列表也利于動畫增強,因為設置特殊的屬性,像透明度和旋轉, 不需要使目標視圖失效(它自動完成)。這個優(yōu)化也適用于顯示列表的視圖 (你應用的任一視圖都硬件加速) 比如,假設有個linearlayout在button上有個listview。linearlayout的顯示列表看上去這樣:drawdisplaylist(listview)drawdisplaylist(button)假設你現在要改變listview的不透明,在調用setalpha(0.5f)后,顯示列表變成:savelayeralpha(0.

11、5)drawdisplaylist(listview)restoredrawdisplaylist(button)listview的設置代碼沒有被執(zhí)行。系統只更新顯示列表中更簡單的linearlayout。在未開啟硬件加速的應用中,列表的繪制代碼在其父親中還會被執(zhí)行一次。不支持的繪畫操作當啟動硬件加速, 2d渲染通道支持一般使用的畫布繪畫操作和一些較少使用的操作。所有的繪畫操作被用于渲染程序,默認為widget和layout,還有些高級應用比如反光和紋理平鋪也是被支持的。下面是不被硬件加速的操作清單:· 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另外, 有些操作在硬件加速開啟后會發(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如果你的應用受缺失屬性和限制的影響,你可以關閉硬件加速,在你受影響的部分調用android.graphics.paint) setlayertype(view.layer_type_software, null) 。這個方法, 你仍可以利用硬件加速其他任一地方。查看controlling hardw

17、are acceleration得到關于硬件加速的更多信息。view 層在android的不同版本, view已經有能力渲染進入屏幕緩存區(qū)內,無論是view的繪制緩存,還是使用android.graphics.paint, int) canvas.savelayer()。屏幕緩存,或層,有多種用途。你可以使用他們獲得更好的性能,當動畫組合視圖或者需要應用復合效應。比如,你可以使用canvas.savelayer()來實現消退效果來臨時渲染一個view進入層,然后使用opacity factor合成到界面。android 3.0 (api level 11)開始,你有更多的控制通過android

18、.graphics.paint) view.setlayertype()方法,怎樣或者什么時候使用layers。這個api有2個參數:layer的類型和可選的paint對象,它闡明layer怎么樣合成。 你可以使用paint參數使用濾色鏡,特殊的混合模式,或者設置為不透明。view可以使用三種layer類型的其中一種:· layer_type_none:被一般渲染并且不會被進入屏幕緩存。這是默認行為。· layer_type_hardware:由硬件渲染到硬件紋理,如果應用開啟硬件加速。如果未開啟, 就同layer_type_software。· layer_ty

19、pe_software:由軟件渲染到位圖。the type of layer you use depends on your goal:· performance: 由硬件渲染到硬件紋理,一旦view被渲染到layer,它的繪圖代碼不會被執(zhí)行直到調用invalidate()。有些動畫,像透明度動畫,直接放入layer,由gpu完成非常有效率。· visual effects:使用硬件或者軟件layer類型和paint,對view應用特殊的視覺處理。比如,你使用colormatrixcolorfilter繪制一個view為黑色或者白色。· compatibility

20、:使用軟件layer類型促使view軟件渲染。如果硬件加速的,有著渲染問題, 這是一個簡單的方法來繞過限制的硬件渲染管道。(計算機學校view層和動畫開啟硬件加速,硬件層提供提供更快的和更平滑的動畫效果。當有很多繪圖操作時,動畫每秒60幀不是一直能保持的。硬件層可以減輕這個,通過渲染為硬件紋理。硬件紋理可以優(yōu)化view,不再需要視圖不斷重繪本身。當你調用invalidate()或者改變view屬性時,view才會重繪。如果動畫顯示的不夠平滑,考慮開啟硬件層在你使用的view。當view進入后臺硬件層,層被混合到界面,view的屬性被控制。設置這些屬性很有效果,因為他們不需要view失效或者重繪

21、。以下屬性作用于混合層。 通過setter測試屬性,獲得最優(yōu)效果:· alpha: 改變層透明度· x, y, translationx, translationy: 改變層位置· scalex, scaley: 改變層大小· rotation, rotationx, rotationy: 改變層的三維定位· pivotx, pivoty: 改變層的轉換源當view被作為objectanimator啟用時,這些屬性被使用其他名字。如果你想使用這些屬性,請調用適當的setter或者getter。比如,為了改變alpha屬性,調用setalpha(

22、) 。下面的代碼片段展示了最有效的方法旋轉viewiew在3d的y軸上: view.setlayertype(view.layer_type_hardware, null);objectanimator.offloat(view, "rotationy", 180).start();  因為硬件層消耗媒體資源,強烈介意你只在持續(xù)動畫時開啟,并且在動畫結束時關閉。你可以使用animation listeners完成: view.setlayertype(view.layer_type_hardware, null);objectanimator animator = objectanimator.offloat(view, "rot

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論