Android性能优化(3)
Android性能優(yōu)化(3)
布局優(yōu)化
在Android 開發(fā)過程中,其實(shí)有很大一部分工作量是在寫布局上,布局寫的好不好,直接影響用戶的直觀感受。如何做一個(gè)運(yùn)行流暢,可靠,ui美觀高效的app,狠重要
渲染
有個(gè)幀的概念先說一下,在數(shù)字世界,有由一定的幀來模擬真實(shí)事物的,有這么一個(gè)規(guī)律:在單位時(shí)間內(nèi),越多的幀被處理,我們看到的事物就越真實(shí)。10-20/幀/s是大腦感受最小的幀數(shù),低于這個(gè)就真的成ptt了。
應(yīng)用程序的運(yùn)行過程中幀速率是最理想是60s(不清楚這個(gè)數(shù)據(jù)的出處,書上看到的)也就是說一幀刷新要在1/60s內(nèi)完成,差不多是16ms的樣子,what ???,當(dāng)然這個(gè)再理論值,理想很豐滿,現(xiàn)實(shí)很骨感,,,,
繪制流程(后來在網(wǎng)上找的,專門補(bǔ)充進(jìn)來的):
附一個(gè)鏈接
Android App卡頓分析,以及使用Choreographer進(jìn)行幀率統(tǒng)計(jì)監(jiān)測感興趣的可以看下,互為補(bǔ)充 -_-
一般是做不到的,比如說視圖層級嵌套太多導(dǎo)致被重繪的次數(shù)太多,占用cpu的太多資源(為什么是cpu,不是都gup了嗎???后面會(huì)說),如果和出現(xiàn)這種情況,這一幀被丟棄,ui界面不會(huì)更新,在下一幀被繪制之前,還是顯示之前的圖像。我們要做的就是避免此類情況的發(fā)生
上圖,展示一下在**setContentView(int layoutId)的加載過程
頂層的DecorView,在主題為Activity設(shè)置背景,就是通過這玩意來顯示的額,其實(shí)這個(gè)是多余的,這個(gè)默認(rèn)的背景會(huì)被設(shè)置的布局文件所覆蓋,我們要做的就是不讓系統(tǒng)做這些無用功
注意
注意
注意
上代碼
<resource><style name = "Theme.NoBackground" parent = "android.Theme"><item name = "android:windowBackground">@null</item></style> </resource>在清單文件里面為Activity設(shè)置主題,把上面的代碼加上就行了
其實(shí)做完這些,你會(huì)發(fā)現(xiàn)沒什么卵用,因?yàn)檫@不會(huì)對性能帶來明顯的改善。但還是建議這么做,性能優(yōu)化東西,都是量變引起質(zhì)變的
硬件加速
之前為什么說cup不說gpu了,在Android的版本演進(jìn)過程中引入了硬件加速,分擔(dān)一部分cpu的工作,所有視圖的渲染以及canvas的繪制,都有g(shù)pu來完成,這個(gè)是在Android 3.0后引入的
其實(shí)現(xiàn)在說這個(gè)好像是在說廢話,最開始這是一個(gè)可選擇項(xiàng),在清單文件里面可以開機(jī)硬件加速,但是在Android 4.0之后就默認(rèn)開啟了,不要你操心了。
在引入硬件加速之前,view的屬性變化都需要重新繪制,硬件加速可以避免這個(gè)問題,因?yàn)榘l(fā)生變化的屬性并不是view本身,而是圖層中的那個(gè)對象。這些屬性變化不會(huì)影響視圖的層級結(jié)構(gòu)
- aloha
- x
- y
- translationX
- translationY
- scaleX
- scaleY
- rotationX
- rotationY
- pivotX
- pivotY
看著是不是很熟悉,沒錯(cuò),就是屬性動(dòng)畫
提高動(dòng)畫的性能,沒說的!!!
上代碼
注意:這個(gè)是在Android 6.0之前要干的事,之后就不用了,自適應(yīng)硬件。這個(gè)是要適配低版本的要做的事
點(diǎn)9圖片
在Android中,管理位圖個(gè)管理點(diǎn)9圖片的方式是不一樣的,系統(tǒng)針對點(diǎn)9圖片進(jìn)行了特殊優(yōu)化,在點(diǎn)9圖片中,被其他視圖所遮蓋的部分,會(huì)被android 渲染成透明的,而透明的像素部分不會(huì)被系統(tǒng)渲染,背景圖片使用點(diǎn)9圖,可以在一定程度上減少過度繪制
布局復(fù)用
- include標(biāo)簽
這個(gè)標(biāo)簽其實(shí)對于開發(fā)者來說減少的只不過是Ctrl+C和Ctrl+V的次數(shù)而已,對于性能而言并沒有多大幫助,依然是有層級的嵌套
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/chat_base_color"android:orientation="vertical"><include layout="@layout/account_infor_item"/><RelativeLayoutandroid:id="@+id/title_layout"android:layout_width="match_parent"android:layout_height="@dimen/d55"android:background="@color/base_color"android:orientation="horizontal"><ImageViewandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_gravity="center_vertical"android:layout_marginLeft="@dimen/d10"android:padding="@dimen/d5"android:src="@mipmap/back" /><TextViewandroid:id="@+id/tv_chat_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_gravity="center"android:layout_marginLeft="@dimen/d10"android:layout_toRightOf="@id/back"android:gravity="center"android:text="@string/name"android:textColor="@color/white"android:textSize="@dimen/d20" /><ImageViewandroid:id="@+id/tv_chat_edit"android:layout_width="@dimen/d40"android:layout_height="@dimen/d40"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="@dimen/d10"android:scaleType="fitXY"android:src="@mipmap/group_icon"android:visibility="gone" /></RelativeLayout> </LinearLayout>就是這樣。。。。
- merge標(biāo)簽
但是這個(gè)就不一樣了,這玩意可以減少布局的允于,整體層級更加扁平,只要將復(fù)用布局文件的跟布局換成merge標(biāo)簽就可以了,在加載的時(shí)候會(huì)忽略掉這個(gè)標(biāo)簽,但是,,,,但是,,,,,但是,使用這個(gè)標(biāo)簽的時(shí)候又兩個(gè)限制
LayoutInflater.from(context).inflate(R.layout.merge_layout,parent,true)
- viewstub標(biāo)簽
這個(gè)就比較厲害了,這東西可以作為一個(gè)節(jié)點(diǎn),被添加到布局文件中,它關(guān)聯(lián)著一個(gè)布局文件,知道運(yùn)行時(shí),才會(huì)被繪制,
<?xml version="1.0" encoding="utf-8"?> <ViewStub xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout="@layout/activity_main"> </ViewStub>上面布局所關(guān)聯(lián)的布局并不會(huì)被實(shí)例化,直到程序運(yùn)行期間調(diào)用了這些方法
- findviewbyid(R.id.viewstub).setVisibility(View.VISIBLE)
或者
- findviewbyid(R.id.viewstub).inflate()
一旦viewstub變?yōu)関isible或者被加載,便不可以再用。以為他在布局層級中的位置被實(shí)例化出來的布局代替了。
這貨很有用,在面對比較復(fù)雜的布局層級是,我們可以使用ViewStub延遲部分view的加載,縮短首次加載的時(shí)間,減少一些不必要的內(nèi)存分配。
好了,這篇就到這了,下篇接著再寫。。。。。
轉(zhuǎn)載于:https://www.cnblogs.com/sunjiandev/p/9407710.html
總結(jié)
以上是生活随笔為你收集整理的Android性能优化(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git命令整理
- 下一篇: Android 简单记事本