最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 優(yōu)化之卡頓優(yōu)化的實(shí)現(xiàn)

 更新時(shí)間:2018年07月11日 14:47:38   作者:七適散人  
這篇文章主要介紹了Android 優(yōu)化之卡頓優(yōu)化的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Android 系統(tǒng)每隔 16ms 會(huì)發(fā)出 VSYNC 信號(hào)重繪界面(Activity)。之所以是 16ms,是因?yàn)?Android 設(shè)定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 幀的刷新率,約合 16ms 刷新一次。

這就意味著,我們需要在 16ms 內(nèi)完成下一次要刷新的界面的相關(guān)運(yùn)算,以便界面刷新更新。

假設(shè)我們更新屏幕的背景圖片需要 24ms 來(lái)做這次運(yùn)算,當(dāng)系統(tǒng)在第一個(gè) 16ms 時(shí)刷新界面,由于運(yùn)算還沒(méi)有結(jié)束,無(wú)法繪出圖片。當(dāng)系統(tǒng)隔 16ms 再發(fā)一次 VSYNC 信息重繪界面時(shí),用戶才會(huì)看到更新后的圖片。也就是說(shuō) 32ms 后才看到了這次刷新(并不是 24ms),這就是丟幀(dropped frame)。

丟幀給用戶的感覺(jué)就是卡頓,而且如果運(yùn)算過(guò)于復(fù)雜,丟幀會(huì)更多,導(dǎo)致界面常常處于停滯狀態(tài)。

卡頓原因

過(guò)于復(fù)雜的布局

  • 界面性能取決于 UI 的渲染性能,UI 渲染的整個(gè)過(guò)程由 CPU 和 GPU 兩個(gè)部分協(xié)同完成。CPU 負(fù)責(zé) UI 布局元素的 Measure、Layout、Draw 等相關(guān)運(yùn)算執(zhí)行,GPU負(fù)責(zé)柵格化(rasterization),將 UI 元素繪制到屏幕上。
  • 如果 UI 布局層次太深,或是自定義控件的 onDraw 中有復(fù)雜運(yùn)算,CPU 的相關(guān)運(yùn)算就可能大于 16ms,導(dǎo)致卡頓。

過(guò)度繪制

UI 線程的復(fù)雜運(yùn)算

  • UI 線程的復(fù)雜運(yùn)算會(huì)造成 UI 無(wú)響應(yīng),導(dǎo)致 ANR,但更多的是造成 UI 響應(yīng)停滯卡頓,ANR 是卡頓的極致。

頻繁的 GC

優(yōu)化方法

1、減少刷新次數(shù)

比如進(jìn)度更新,要進(jìn)度有變化再去刷新,且保證頻率不得高于系統(tǒng)的刷新頻率。

2、避免非必要的刷新

若控件不可見,則無(wú)需刷新。

3、避免后臺(tái)線程影響

如列表控件,在滑動(dòng)時(shí)不要去加載圖片,可以在滑動(dòng)監(jiān)聽里停止圖片的加載。

4、局部刷新

如 RecyclerView 的 DiffUtil。自定義 View 可以使用下面兩個(gè)方法:

invalidate(Rect dirty);
invalidate(int left, int top, int right, int bottom);

5、盡量使用屬性動(dòng)畫,它減少了自身的重繪。最后要清除

StringBuilder,List 等在創(chuàng)建時(shí)傳入一個(gè)合適的參數(shù)指定初始容量,以避免頻繁擴(kuò)容的開銷。

6、開啟硬件加速

7、原理可見 Android硬件加速原理與實(shí)現(xiàn)簡(jiǎn)介,理解Android硬件加速原理的小白文

Application 級(jí)別

<application android:hardwareAccelerated="true" />

Activity 級(jí)別

<activity android:hardwareAccelerated="true" />

Window 級(jí)別

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View 級(jí)別

// 如果是 software,會(huì)將 View 繪制到一個(gè) Bitmap,
// 然后依然是通過(guò)硬件加速將 Bitmap 繪制到 Canvas
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  • LAYER_TYPE_NONE:普通渲染方式,不會(huì)返回一個(gè)離屏的緩沖,默認(rèn)值。
  • LAYER_TYPE_HARDWARE:如果這個(gè)應(yīng)用使用了硬件加速,這個(gè) View 將會(huì)在硬件中渲染為 硬件紋理,如果應(yīng)用程序并沒(méi)有被硬件加速,則其效果和 LAYER_TYPE_SOFTWARE 相同。
  • LAYER_TYPE_SOFTWARE:此 View 通過(guò)軟件渲染為一個(gè) Bitmap。

檢查是否開啟了硬件加速

view.isHardware-Accelerated();
Canvas.isHardwareAccelerated();

如果 View 中要處理中文長(zhǎng)文本,需要關(guān)閉硬件加速。因?yàn)槊總€(gè)中文編碼不一樣,緩存效果不理想。

監(jiān)控

  1. 《Android 應(yīng)用性能優(yōu)化最佳實(shí)踐》2.8 章,主要利用 MainLooper 里的 Printer。
  2. BlockCanary 開源庫(kù)
  3. StrctMode

ANR

Activity 的 View:5 秒無(wú)響應(yīng)
BroadcastReceiver:10 秒無(wú)響應(yīng)
Service:20 秒無(wú)響應(yīng)

ANR 時(shí),系統(tǒng)會(huì)生成一個(gè) traces.txt 的文件放在 /data/anr/ 下。通過(guò) adb 命令將其導(dǎo)出到本地

$adb pull data/anr/traces.txt ~/Desktop

UI 線程做耗時(shí)操作,內(nèi)存泄露導(dǎo)致內(nèi)存不足都可能產(chǎn)生 ANR。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android Adapter里面嵌套ListView實(shí)例詳解

    Android Adapter里面嵌套ListView實(shí)例詳解

    這篇文章主要介紹了Android Adapter里面嵌套ListView實(shí)例詳解的相關(guān)資料,這里提供實(shí)例代碼并說(shuō)明如何實(shí)現(xiàn)該功能,需要的朋友可以參考下
    2017-07-07
  • Android RecyclerView 復(fù)用錯(cuò)亂通用解法詳解

    Android RecyclerView 復(fù)用錯(cuò)亂通用解法詳解

    本篇文章主要介紹了Android RecyclerView 復(fù)用錯(cuò)亂通用解法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Android 超詳細(xì)講解fitsSystemWindows屬性的使用

    Android 超詳細(xì)講解fitsSystemWindows屬性的使用

    fitsSystemWindows屬性可以讓view根據(jù)系統(tǒng)窗口來(lái)調(diào)整自己的布局;簡(jiǎn)單點(diǎn)說(shuō)就是我們?cè)谠O(shè)置應(yīng)用布局時(shí)是否考慮系統(tǒng)窗口布局,這里系統(tǒng)窗口包括系統(tǒng)狀態(tài)欄、導(dǎo)航欄、輸入法等,包括一些手機(jī)系統(tǒng)帶有的底部虛擬按鍵
    2022-03-03
  • Android編程獲取控件寬和高的方法總結(jié)分析

    Android編程獲取控件寬和高的方法總結(jié)分析

    這篇文章主要介紹了Android編程獲取控件寬和高的方法,結(jié)合實(shí)例形式對(duì)比總結(jié)并分析了Android控件屬性的相關(guān)操作技巧,需要的朋友可以參考下
    2016-01-01
  • Android仿美團(tuán)外賣菜單界面

    Android仿美團(tuán)外賣菜單界面

    這篇文章主要為大家詳細(xì)介紹了Android仿美團(tuán)外賣菜單界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android利用代碼控制設(shè)備上其他音樂(lè)播放器的方法

    Android利用代碼控制設(shè)備上其他音樂(lè)播放器的方法

    這篇文章主要給大家介紹了關(guān)于Android利用代碼如何控制設(shè)備上其他音樂(lè)播放器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • android 默認(rèn)時(shí)間格式修改方法

    android 默認(rèn)時(shí)間格式修改方法

    在android使用中,遇到修改默認(rèn)時(shí)間格式時(shí),總是束手無(wú)策,本文將以此問(wèn)題提供解決方案,需要了解的朋友可以參考下
    2012-11-11
  • Android使用CountDownTimer實(shí)現(xiàn)倒計(jì)時(shí)效果

    Android使用CountDownTimer實(shí)現(xiàn)倒計(jì)時(shí)效果

    這篇文章主要為大家詳細(xì)介紹了Android使用CountDownTimer實(shí)現(xiàn)倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android 使用registerReceiver注冊(cè)BroadcastReceiver案例詳解

    Android 使用registerReceiver注冊(cè)BroadcastReceiver案例詳解

    這篇文章主要介紹了Android 使用registerReceiver注冊(cè)BroadcastReceiver案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Android中實(shí)現(xiàn)WebView和JavaScript的互相調(diào)用詳解

    Android中實(shí)現(xiàn)WebView和JavaScript的互相調(diào)用詳解

    這篇文章主要給大家介紹了關(guān)于Android中實(shí)現(xiàn)WebView和JavaScript的互相調(diào)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2018-03-03

最新評(píng)論

鹤壁市| 砚山县| 南召县| 奉化市| 长汀县| 蒙山县| 墨竹工卡县| 明水县| 杭锦后旗| 交城县| 葵青区| 麟游县| 东兰县| 南涧| 汶川县| 昌黎县| 乐安县| 抚州市| 九龙县| 石渠县| 南昌市| 页游| 彩票| 同仁县| 读书| 巴楚县| 民丰县| 会宁县| 岚皋县| 新乐市| 临湘市| 长宁区| 洛川县| 家居| 英吉沙县| 南城县| 揭西县| 扎赉特旗| 大田县| 合阳县| 温州市|