激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - Android 優(yōu)化之卡頓優(yōu)化的實現(xiàn)

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

2022-03-11 15:35七適散人 Android

這篇文章主要介紹了Android 優(yōu)化之卡頓優(yōu)化的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

卡頓原因

過于復(fù)雜的布局

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

過度繪制

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

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

頻繁的 GC

優(yōu)化方法

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

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

2、避免非必要的刷新

若控件不可見,則無需刷新。

3、避免后臺線程影響

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

4、局部刷新

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

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

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

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

6、開啟硬件加速

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

Application 級別

?
1
<application android:hardwareAccelerated="true" />

Activity 級別

?
1
<activity android:hardwareAccelerated="true" />

Window 級別

?
1
2
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View 級別

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

檢查是否開啟了硬件加速

?
1
2
view.isHardware-Accelerated();
Canvas.isHardwareAccelerated();

如果 View 中要處理中文長文本,需要關(guān)閉硬件加速。因為每個中文編碼不一樣,緩存效果不理想。

監(jiān)控

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

ANR

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jianshu.com/p/5e508beffac8

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美a视频| 色成人在线 | 91短视频网址 | 国产一区二区精彩视频 | 女人一级一级毛片 | 最新av网址在线观看 | 亚洲成人在线视频网 | 91精品国产九九九久久久亚洲 | 午夜天堂在线 | av在线等| 久久99精品久久久久久秒播蜜臀 | www.91pron | 日韩欧美电影一区二区三区 | 爽成人777777婷婷 | 在线成人免费视频 | 免费黄色在线电影 | 18欧美性xxxx极品hd | 国产妞干网 | 国产精品视频一区二区三区四 | 成人激情视频网 | 毛片视频免费观看 | 日韩美香港a一级毛片免费 欧美一级淫片007 | h网站在线观看 | 欧美一级特黄aaaaaaa什 | 久久欧美亚洲另类专区91大神 | 日本视频在线播放 | 露脸各种姿势啪啪的清纯美女 | 国产无遮挡一区二区三区毛片日本 | 国产精品久久久久无码av | 韩国精品视频在线观看 | 亚洲卡通动漫在线观看 | 性片免费看 | 一级做受毛片免费大片 | 欧美日韩高清在线观看 | 午夜伦情电午夜伦情电影 | 国产亚洲精品成人a | 91伊人久久| 黄色免费播放网站 | 精品xxxx户外露出视频 | 97超碰资源站 | 精品一区二区三区日本 |