一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Android - Android 優化之卡頓優化的實現

Android 優化之卡頓優化的實現

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

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

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

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

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

丟幀給用戶的感覺就是卡頓,而且如果運算過于復雜,丟幀會更多,導致界面常常處于停滯狀態。

卡頓原因

過于復雜的布局

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

過度繪制

UI 線程的復雜運算

  • UI 線程的復雜運算會造成 UI 無響應,導致 ANR,但更多的是造成 UI 響應停滯卡頓,ANR 是卡頓的極致。

頻繁的 GC

優化方法

1、減少刷新次數

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

2、避免非必要的刷新

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

3、避免后臺線程影響

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

4、局部刷新

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

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

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

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

6、開啟硬件加速

7、原理可見 Android硬件加速原理與實現簡介,理解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:如果這個應用使用了硬件加速,這個 View 將會在硬件中渲染為 硬件紋理,如果應用程序并沒有被硬件加速,則其效果和 LAYER_TYPE_SOFTWARE 相同。
  • LAYER_TYPE_SOFTWARE:此 View 通過軟件渲染為一個 Bitmap。

檢查是否開啟了硬件加速

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

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

監控

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

ANR

Activity 的 View:5 秒無響應
BroadcastReceiver:10 秒無響應
Service:20 秒無響應

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

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

UI 線程做耗時操作,內存泄露導致內存不足都可能產生 ANR。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色综合综合 | 我和么公的秘密小说免费 | 特级毛片免费视频观看 | 亚洲国产天堂久久精品网 | 高清男的插曲女的 欢迎你老狼 | 91香蕉视频在线观看 | 国产性色视频 | 日本视频在线免费看 | 欧美一级专区免费大片俄罗斯 | japanesepooping脱粪 | 99年水嫩漂亮粉嫩在线播放 | 国产一级片免费视频 | 久久亚洲伊人 | caoporen97免费公开视频 | 18亚洲chinese男男1069 | 欧美又大又粗又长又硬 | 国产高清视频一区二区 | 男人的天堂久久精品激情a 男人的天堂va | 大伊香蕉精品视频一区 | 国产日韩综合 | 人人揉人人爽五月天视频 | 国产精品久久久久久爽爽爽 | 国产高清在线精品一区二区三区 | 亚洲国产精品久久网午夜小说 | 小早川怜子在线播放精品 | 四神集团1涨奶是第几章 | 亚洲欧美成人综合久久久 | 女上男下gifxxoo动态视频 | 四虎影视色费永久在线观看 | 99久久精品6在线播放 | 国产一区二| 169pp美女| 日韩大片免费观看 | 天天操天天爽天天射 | 国产三级精品久久三级国专区 | 日本制服丝袜 | 擦逼视频 | 欧美黑大吊 | 精品视频二区 | 69罗莉视频在线观看 | 男生和老师一起差差差 |