為什麼程序會「卡」?
原文鏈接
作者:果果
應用程序丟幀,也就是我們常說的「卡」,是影響用戶體驗的主要原因之一,今天,果果帶大家從Android系統的底層繪製原理中了解下「卡」的產生的原因。
作為顯示設備,無論是電腦屏幕還是手機屏幕,都有一個刷新率的概念,這個概念我們可以簡單的理解為屏幕每秒中可以顯示多少幅不同的畫面。一般的手機屏幕的刷新率為60HZ,也就是說這種屏幕每秒可以顯示60幅畫面。
為了讓系統繪製UI的頻率與屏幕硬體的刷新率一致,Android的繪製系統引入了VSYNC(垂直同步)的概念:在屏幕刷新率為60HZ的手機上,Android系統會每隔1/60秒發送一個VSYNC信號,當繪製模塊接受到信號後,就會將已經繪製完成的畫面發送到屏幕上。
上圖中藍色的矩形表示CPU處理UI變化所耗費的時間,例如計算圖形的大小、位置等,綠色的矩形表示GPU對計算好的UI界面進行硬體渲染,黃色矩形區域則表示屏幕。阿拉伯數字表示幀的編號。當繪製系統接收到VSYNC信號時,會將前一幀的內容投放到屏幕(如果此時CPU和GPU的工作已經完成),並同時進入下一幀的繪製周期。如果每一幀的繪製周期(繪製一幀所需要的CPU耗時+GPU耗時)都小於1/60秒,就能夠保證屏幕每次刷新都能及時的將最新的內容投放到屏幕上。
如果你的應用可以保證,在每次VSYNC信號到來之前,GPU都已經完成了渲染操作,那麼,你的應用使用起來就是「流暢」的。下面,我們看看那些「卡頓」的應用都發生了什麼。
由於CPU或者GPU的工作周期太長,導致在下一個VSYNC信號到來之前還沒有準備好當前幀的渲染,顯示器只能繼續顯示前一幀的內容。假設屏幕當前正在做一個小球每秒移動1000個像素的動畫,在不出現丟幀的情況時,每經過1/60秒(一個VSYNC周期)小球的位移應該約等於16個像素(1000/60),然而一旦發生丟幀,小球就會在丟幀的周期內處於靜止,動畫「卡」住了。
為了便於開發者監測「卡頓」問題,Android系統在系統設置的開發者選項內提供了丟幀監測的功能,當該功能開啟後,我們可以看到下圖中的效果:
圖片底部的豎線表示繪製每一幀的耗時,水平方向的綠線表示每次VSYNC信號到來的時間,當豎線的高度超過綠線時,丟幀就發生了。導致丟幀的原因有很多,果果之前的一篇老文章介紹了由於「過度繪製」導致的丟幀,想溫習的同學可以點這裡查閱。
閱讀原文
推薦閱讀:
※蘋果要等到什麼時候才出安卓手機?
※金立將發布互聯網手機品牌 IUNI,它可能複製小米的成功嗎?
※聖誕節特別版 - 遊戲也要過聖誕 #iOS #Android
※Android 開發中最蛋疼的部分是什麼?