自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于Android圖形系統(tǒng)的一些事實(shí)真相

移動(dòng)開(kāi)發(fā)
現(xiàn)在網(wǎng)上滿天飛的各類關(guān)于Android圖像渲染的水文實(shí)在讓我不爽,下面給大家一些關(guān)于Android硬件渲染的事實(shí)真相,硬件加速并非大家想的那么完美,而我們也一直在改進(jìn)!

1. Android 一直在使用硬件加速。實(shí)際上從1.0版本之后,所有的窗口元素的合成與顯示都是通過(guò)硬件完成的。

2.這意味著許多你所看見(jiàn)的動(dòng)畫(huà)都是被加速過(guò)的:按鈕的顯示、通知欄下拉的陰影、不同Activity之間的切換動(dòng)畫(huà)、彈出窗口以及提示框的顯示和隱藏等等等等。

3.Android以前使用軟件方式(與硬件加速相對(duì)應(yīng))來(lái)控制各個(gè)窗口元素的渲染,例如下圖的UI,其中包括四個(gè)窗口組件:狀態(tài)條、壁紙、桌面上的的啟動(dòng)器、以及菜單。如果其中一個(gè)元素更改了自身的內(nèi)容,例如高亮一個(gè)菜單條目,對(duì)于3.0之前的版本,系統(tǒng)使用軟件方式來(lái)繪制新的內(nèi)容,然而并非所有的元素都需要被重新繪制,同時(shí)各個(gè)窗口元素的拼接也是通過(guò)硬件方式完成的。類似的,任何窗口的移動(dòng):例如菜單的上下運(yùn)動(dòng)是完全通過(guò)硬件方式渲染的。

 

 

4. 現(xiàn)在我們來(lái)關(guān)注窗口元素的內(nèi)部渲染,實(shí)際上為了達(dá)到每秒60幀的FPS,你并不一定需要硬件加速。幀速取決于要顯示的像素的數(shù)量以及CPU的速度。比如說(shuō),二兒子完全可以以60FPS的速度在它800*480分辨率的屏幕上完成任何普通的原生UI動(dòng)畫(huà),例如列表的滾動(dòng)等,完全沒(méi)有問(wèn)題。而最初的Droid系列卻很難達(dá)到這樣的速度。

5.在Android3.0中可以實(shí)現(xiàn)窗口的”完全”的硬件加速繪制。而在Android 4.0中也沒(méi)有引入更多的功能。 從3.0開(kāi)始,如果在你的應(yīng)用中設(shè)置了一個(gè)標(biāo)志允許硬件加速,那么此時(shí)所有的窗口的繪制都會(huì)交給GPU來(lái)完成。在Android 4.0中最主要的改變就是:在面向Android4.0或更高版本的應(yīng)用中,硬件加速是被默認(rèn)開(kāi)啟的,再也不需要在配置文件中設(shè)置 android:handwareAccelerated=”true”.(而我們不允許之前的應(yīng)用默認(rèn)打開(kāi)硬件加速,是因?yàn)楣饪坑布铀伲瑹o(wú)法很好的完成某些特殊的繪制操作;同時(shí)在應(yīng)用需要其中一部分UI更新的時(shí)候,會(huì)影響其的一些表現(xiàn)。對(duì)于目前現(xiàn)有的很多應(yīng)用,強(qiáng)制開(kāi)啟硬件加速,會(huì)明顯的中斷應(yīng)用的運(yùn)行)

6.硬件加速并不如大家所認(rèn)為的那樣***。例如在基于PVR驅(qū)動(dòng)的設(shè)備上(比如二兒子跟三兒子),光是在進(jìn)程中開(kāi)啟OpenGL就得占用8M的RAM。對(duì)比一般進(jìn)程的2M的開(kāi)銷實(shí)在是巨大。RAM是有限的,一大部分被拿去繪制,那么其他正在運(yùn)行的進(jìn)程就會(huì)因?yàn)槿鄙賰?nèi)存而出問(wèn)題,比如降低應(yīng)用間切換的速度。

7.由于OpenGL的額外開(kāi)銷,我們***不要過(guò)多的使用其進(jìn)行繪制。比如我們現(xiàn)在在做的一些工作,就是為了讓Android 4.0能在不使用硬件加速的情況下流暢的在二兒子上使用:這樣我們就不需要在系統(tǒng)進(jìn)程中浪費(fèi)8MB的內(nèi)存用,也不需要在手機(jī)進(jìn)程中浪費(fèi)額外的8M內(nèi)存,或者是在系統(tǒng)UI進(jìn)程中的8MB內(nèi)存 等等等等。相信我,你不會(huì)注意到——用OpenGL來(lái)繪制一些類似狀態(tài)欄或是華麗的動(dòng)畫(huà)是完全沒(méi)有好處的。

#p#

8.硬件加速并非流暢UI的“解藥”。我們?yōu)榱薝I的流暢嘗試了很多不同的方法,比如說(shuō)在1.6中引入的對(duì)前臺(tái)/后臺(tái)進(jìn)程的調(diào)度策略,在2.3中的對(duì)輸入系統(tǒng)的重寫(xiě),”嚴(yán)厲模式”的使用,并發(fā)的垃圾回收機(jī)制,載入器等等。如果你想達(dá)到60fps的幀速,你只有20毫秒的時(shí)間來(lái)處理每幀的內(nèi)容。這時(shí)間實(shí)在不長(zhǎng),光是在UI進(jìn)程中讀取存儲(chǔ)卡的操作產(chǎn)生的延時(shí)就會(huì)大于這個(gè)時(shí)限,尤其是在寫(xiě)操作的時(shí)候。

9.舉些最近發(fā)現(xiàn)的一些影響UI流暢度的例子:我們注意到在二兒子上,使用4.0時(shí)列表的滾動(dòng)就不如使用2.3時(shí)流暢。而導(dǎo)致這個(gè)現(xiàn)象的原因則是計(jì)時(shí)器的輕微漂移:有些時(shí)候應(yīng)用正在接收觸摸事件并在屏幕上繪制,而在上一個(gè)動(dòng)作還沒(méi)完成的的時(shí)候,就接受到下一個(gè)事件并開(kāi)始繪制,導(dǎo)致它丟失了當(dāng)前這幀。盡管發(fā)生這種現(xiàn)象的時(shí)候,幀速能達(dá)到穩(wěn)定的60FPS.(當(dāng)然,這個(gè)問(wèn)題已經(jīng)修正)

10.當(dāng)人們比較Android跟IOS上瀏覽器的滾動(dòng)流暢度的時(shí)候,他們所看見(jiàn)的差別并非開(kāi)沒(méi)開(kāi)啟硬件加速所導(dǎo)致。最初的時(shí)候,Android使用了一種完全不同的渲染策略,并做了一些折中:網(wǎng)頁(yè)被轉(zhuǎn)換成一個(gè)”顯示列表“,持續(xù)的在屏幕上進(jìn)行繪制,而非使用塊(Tiles)的形式。它有一個(gè)優(yōu)點(diǎn):就是在滾動(dòng)或是縮放的時(shí)候不會(huì)發(fā)生有的塊還沒(méi)被渲染出來(lái)的現(xiàn)象(譯者注:早期的IOS上這種現(xiàn)象非常明顯,快速滾動(dòng)到底部時(shí)要等一會(huì)網(wǎng)頁(yè)才會(huì)一塊一塊的繪制出來(lái))。 而這個(gè)方法的不給力之處就在于頁(yè)面復(fù)雜的時(shí)候,幀速就明顯低了。例如Android3.0,瀏覽器中現(xiàn)在開(kāi)始使用塊的方式進(jìn)行渲染,于是它可以在滾動(dòng)或是放大的時(shí)候保持一個(gè)穩(wěn)定的幀速,自然也會(huì)出現(xiàn)新的塊沒(méi)有被立即渲染出來(lái)的情況。 而每個(gè)塊都是以軟件方式繪制的,我相信在IOS中也是這樣的。(在3.0之前的版本中,沒(méi)有開(kāi)啟硬件加速,基于塊的策略也可以使用。而且如我之前提到的,二兒子可以很容易的達(dá)到60FPS)

11.硬件加速不能如大家所想奇跡般的讓繪制的問(wèn)題統(tǒng)統(tǒng)消失。GPU的性能就是一個(gè)很重要的限制。最近一個(gè)很有趣的例子:基于英偉達(dá)的Tegra2的平板可以很容易的以60FPS的速度訪問(wèn)2.5次1280*800分辨率的屏幕中的任何一個(gè)像素?,F(xiàn)在考慮到在Android 3.0中切換到所有應(yīng)用列表的情形:你需要繪制背景(1x 所有的像素)、接著是快捷方式和桌面小工具(假設(shè)內(nèi)容不多,花費(fèi)0.5x),接著是所有應(yīng)用的黑色背景(1x),接著是所有應(yīng)用的ICON(0.5x)。顯然,我們已經(jīng)超過(guò)了原先的預(yù)算了,而此時(shí)我們還沒(méi)完成各個(gè)獨(dú)立窗口元素的拼接并做***的顯示。想要取得60FPS的動(dòng)畫(huà),Android 3.0以及后續(xù)版本使用了一系列的小技巧。 其中主要的一個(gè)就是: 它將所有的窗口元素平鋪在一個(gè)層中,而不是挨個(gè)拷貝到CPU的緩存中。但即使是這樣,我們已然超出預(yù)算,幸好我們使用另一個(gè)技巧:因?yàn)锳ndroid中的背景是一個(gè)獨(dú)立的窗口元素,我們可以將它設(shè)置的比屏幕更大來(lái)放置整幅位圖,現(xiàn)在,用戶開(kāi)始滑動(dòng),背景跟著運(yùn)動(dòng),此時(shí)并不需要任何特殊的繪制,僅僅是移動(dòng)窗口即可,而由于這個(gè)窗口是在一個(gè)平鋪層上,我們甚至不需要用GPU來(lái)將這個(gè)窗口元素組織到屏幕中輸出。

12.隨著屏幕分辨率的不斷升高,能否達(dá)到60FPS跟GPU的速度尤其是內(nèi)存總線帶寬息息相關(guān)。事實(shí)上,如果你想要提升硬件的效力,特別注意要提升內(nèi)存總線的帶寬。很多時(shí)候CPU(特別是帶有***的NEON指令集的CPU)會(huì)比內(nèi)存總線塊的多。

UPDATE:下面居然有這么多討論,但是我木有能力解釋清楚相關(guān)的所有問(wèn)題了。不過(guò)我會(huì)盡力在這里提供一些我認(rèn)為比較有趣的觀點(diǎn)。

有些人認(rèn)為蓋世兔已經(jīng)有了一個(gè)非常流暢的UI并指出他們已經(jīng)超越三兒子并做了很多改進(jìn)。事實(shí)上,大家忽略了很多設(shè)備的差異,蓋世兔的屏幕是480*800而三兒子是720*1280。如果二兒子在它480*800的屏幕上都能達(dá)到60FPS,擁有更NB的CPU的蓋世兔必須得同樣流暢嘛。

而兩者之間***的差別就是三兒子需要同時(shí)繪制2.4倍于蓋世兔的像素。這相當(dāng)于在單核上提升到2.4倍的速度。(需要指出 在UI渲染的時(shí)候,多核是沒(méi)有意義的,因?yàn)殇秩颈仨氁谝粋€(gè)進(jìn)程中完成,無(wú)法并行)

這就是為什么硬件加速非常重要:隨著像素的提升,GPU通常能更好的處理圖像的運(yùn)算。事實(shí)上,這是我們?cè)贏ndroid中引入硬件加速的***動(dòng)力。在720*1280的屏幕上,現(xiàn)有的ARM CPU達(dá)到60FPS很吃力,但是通過(guò)GPU渲染就不同了。同樣,在與蓋世兔的比較中,同時(shí)打開(kāi)沒(méi)有硬件加速的應(yīng)用,在三兒子中無(wú)法達(dá)到蓋世兔同樣的60FPS,是因?yàn)樗娩秩?.4倍于蓋世兔的像素。

在***,還得提及GPU的另外一個(gè)優(yōu)勢(shì):許多繪制的效果變得更加容易。比如你要以軟件形式繪制一個(gè)位圖,你除了設(shè)置一個(gè)位移,不能做任何事。僅僅是縮小就得花上相當(dāng)多的時(shí)間進(jìn)行渲染。而在GPU中,此類轉(zhuǎn)換則相當(dāng)容易。這就是為神馬新的默認(rèn)主題Holo使用硬件加速繪制背景。而在沒(méi)有開(kāi)啟硬件加速的應(yīng)用中,此類背景會(huì)自動(dòng)去掉。

【編輯推薦】

  1. 谷歌董事長(zhǎng)施密特:Android已領(lǐng)先iPhone
  2. 觀點(diǎn):iOS更適合游戲 Android更適合應(yīng)用
  3. 前谷歌實(shí)習(xí)生:為什么iOS比Android更順滑

 

責(zé)任編輯:冰凝兒 來(lái)源: 大航路的博客
相關(guān)推薦

2011-07-13 09:13:56

Android設(shè)計(jì)

2020-02-27 21:37:33

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)應(yīng)用

2013-04-07 10:40:55

前端框架前端

2009-06-18 09:51:25

Java繼承

2021-02-20 17:16:39

Go語(yǔ)言Go開(kāi)發(fā)者編程

2012-09-25 10:03:56

JavaJava封面Java開(kāi)發(fā)

2021-08-08 10:44:33

安卓系統(tǒng)開(kāi)發(fā)者手機(jī)廠商

2009-05-31 09:45:04

游戲開(kāi)發(fā)美工設(shè)計(jì)師

2009-06-04 16:28:43

EJB常見(jiàn)問(wèn)題

2011-03-11 09:27:11

Java性能監(jiān)控

2012-04-19 10:06:55

微軟Windows 8 E

2015-12-04 10:04:53

2020-09-28 06:45:42

故障復(fù)盤修復(fù)

2022-04-14 10:22:44

故事卡業(yè)務(wù)

2017-12-21 07:54:07

2017-09-20 15:07:32

數(shù)據(jù)庫(kù)SQL注入技巧分享

2016-10-18 22:10:02

HTTP推送HTML

2009-06-18 10:53:52

Hibernate3.

2020-05-19 14:35:42

Shell腳本循環(huán)

2021-06-10 10:02:19

優(yōu)化緩存性能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)