日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入理解Android的渲染機(jī)制

基礎(chǔ)知識

10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有阿瓦提免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

CPU: 中央處理器,它集成了運(yùn)算,緩沖,控制等單元,包括繪圖功能.CPU將對象處理為多維圖形,紋理(Bitmaps、Drawables等都是一起打包到統(tǒng)一的紋理)。

GPU:一個(gè)類似于CPU的專門用來處理Graphics的處理器, 作用用來幫助加快格柵化操作,當(dāng)然,也有相應(yīng)的緩存數(shù)據(jù)(例如緩存已經(jīng)光柵化過的bitmap等)機(jī)制。

OpenGL ES:是手持嵌入式設(shè)備的3DAPI,跨平臺的、功能完善的2D和3D圖形應(yīng)用程序接口API,有一套固定渲染管線流程. OpenGL ES詳解

DisplayList 在Android把XML布局文件轉(zhuǎn)換成GPU能夠識別并繪制的對象。這個(gè)操作是在DisplayList的幫助下完成的。DisplayList持有所有將要交給GPU繪制到屏幕上的數(shù)據(jù)信息。

格柵化 是 將圖片等矢量資源,轉(zhuǎn)化為一格格像素點(diǎn)的像素圖,顯示到屏幕上。

垂直同步VSYNC:讓顯卡的運(yùn)算和顯示器刷新率一致以穩(wěn)定輸出的畫面質(zhì)量。它告知GPU在載入新幀之前,要等待屏幕繪制完成前一幀。下面的三張圖分別是GPU和硬件同步所發(fā)生的情況,Refresh Rate:屏幕一秒內(nèi)刷新屏幕的次數(shù),由硬件決定,例如60Hz.而Frame Rate:GPU一秒繪制操作的幀數(shù),單位是30fps,正常情況過程圖如下: 

渲染機(jī)制分析

渲染流程簡介

Android整體的繪制流程如下:

UI對象—->CPU處理為多維圖形,紋理 —–通過OpeGL ES接口調(diào)用GPU—-> GPU對圖進(jìn)行光柵化(Frame Rate ) —->硬件時(shí)鐘(Refresh Rate)—-垂直同步—->投射到屏幕 

Android系統(tǒng)每隔16ms發(fā)出VSYNC信號(1000ms/60=16.66ms),觸發(fā)對UI進(jìn)行渲染, 如果每次渲染都成功,這樣就能夠達(dá)到流暢的畫面所需要的60fps,為了能夠?qū)崿F(xiàn)60fps,這意味著計(jì)算渲染的大多數(shù)操作都必須在16ms內(nèi)完成。

渲染時(shí)間線 

  

正常情況下Android的GPU會在16ms完成頁面的繪制,如果一幀畫面渲染時(shí)間超過16ms的時(shí)候,垂直同步機(jī)制會讓顯示器硬件 等待GPU完成柵格化渲染操作,然后再次繪制界面,這樣就會看起來畫面停頓。

當(dāng)GPU渲染速度過慢,就會導(dǎo)致如下情況,某些幀顯示的畫面內(nèi)容就會與上一幀的畫面相同。 

渲染常見問題

GPU過度繪制

OverDraw是開發(fā)中常見的優(yōu)化點(diǎn),是指一個(gè)界面出現(xiàn)層層繪制的情況,如: 

我們可以使用一些第三方工具來查看是否過渡繪制。如小米魅族。

任何時(shí)候View中的繪制內(nèi)容發(fā)生變化時(shí),都會重新執(zhí)行創(chuàng)建DisplayList,渲染DisplayList,更新到屏幕上等一 系列操作。這個(gè)流程的表現(xiàn)性能取決于你的View的復(fù)雜程度,View的狀態(tài)變化以及渲染管道的執(zhí)行性能。

當(dāng)View的大小發(fā)生改變,DisplayList就會重新創(chuàng)建,然后再渲染,而當(dāng)View發(fā)生位移,則DisplayList不會重新創(chuàng)建,而是執(zhí)行重新渲染的操作。

所以當(dāng)界面過于復(fù)雜的時(shí)候,DisplayList繪制界面就會出現(xiàn)延遲而造成卡頓。

我們可以使用渲染工具檢測,工具中,不同手機(jī)呈現(xiàn)方式可能會有差別.分別關(guān)于StatusBar,NavBar,激活的程序Activity區(qū)域的GPU Rending信息。激活的程序Activity區(qū)域的GPU Rending信息。

我們打開手機(jī)的GPU Rending呈現(xiàn)的信息,我們以魅族為例: 

    

說明:每一條柱狀線都包含三部分,

藍(lán)色代表測量繪制Display List的時(shí)間,

紅色代表OpenGL渲染Display List所需要的時(shí)間,

黃色代表CPU等待GPU處理的時(shí)間。

Android渲染優(yōu)化

讀懂Android的渲染機(jī)制對于優(yōu)化,特別是在寫布局的時(shí)候是很有幫助的。減少布局層級,減少GPU的渲染這對我們提供app的質(zhì)量是很有幫助的。

去掉不必要的界面: 

 

布局層級優(yōu)化

使用Hierarchy Viewer工具可以查看界面的層級,關(guān)于這塊的介紹請查看我之前的博客:Android布局優(yōu)化 

當(dāng)然Android在某些系統(tǒng)版本也增加了檢測overdraw的工具。如Android 在4。2版本中增加了Debug GPU Overdraw選項(xiàng),如果你用的是Jelly Bean 4.3 或者 KitKat 設(shè)備,在屏幕的左下角會有一個(gè)計(jì)數(shù)展示屏幕overdraw的程度。

另一種查看overdraw的方式是在Debug GPU overdraw菜單里選擇“Show Overdraw areas”選項(xiàng)。選擇之后,會在app的不同區(qū)域覆蓋不同的顏色來表示overdraw的次數(shù)。比較屏幕上這些不同的顏色,可以快速方便的定位overdraw問題。

圖片格式選擇

Android的界面能用png最好是用png了,因?yàn)?2位的png顏色過渡平滑且支持透明。jpg是像素化壓縮過的圖片,質(zhì)量已經(jīng)下降了,再拿來做9path的按鈕和平鋪拉伸的控件必然慘不忍睹,要盡量避免。有條件的可以選擇webpp,這種格式的圖片占據(jù)的大小比較小,并且能滿足手機(jī)顯示的需要。

當(dāng)背景無法避免,盡量用Color.TRANSPARENT

因?yàn)橥该魃獵olor.TRANSPARENT是不會被渲染的,他是透明的。

所以我們在設(shè)置界面的時(shí)候需要做一個(gè)判斷:

 
 
 
 
  1. Bean bean=list.get(i);  
  2. if (bean.img == 0) { 
  3.             Picasso.with(getContext()).load(android.R.color.transparent).into(holder.imageView); 
  4.             holder.imageView.setBackgroundColor(bean.backPic); 
  5.         } else { 
  6.             Picasso.with(getContext()).load(bean.img).into(holder.imageView); 
  7.             holder.imageView.setBackgroundColor(Color.TRANSPARENT); 
  8.         }  

分享文章:深入理解Android的渲染機(jī)制
網(wǎng)頁鏈接:http://m.5511xx.com/article/codcdpo.html