對手機而言,細(xì)微的卡頓是一種很主觀的感覺。為了將手機卡頓與否以一種客觀的形式“量化”,網(wǎng)上傳出了一種關(guān)于“玄學(xué)曲線”的傳說。那么,這種曲線究竟能否反映出手機的卡頓與否呢?
隱藏的開發(fā)者模式
每一款A(yù)ndroid手機的設(shè)置選項中都隱藏了一個功能,它就是“開發(fā)者選項”(又稱開發(fā)者模式)。這個功能的本意,是幫助軟件開發(fā)者進(jìn)行功能的調(diào)試和優(yōu)化。但是,該選項里面的很多功能,都能給我們帶來驚喜。
比如,很多品牌手機的USB調(diào)試模式就被隱藏在了開發(fā)者選項里,當(dāng)需要借助PC ROOT手機,或是PC上的某些客戶端軟件與手機連接時都需要打開USB調(diào)試模式才能實現(xiàn)全部功能。此外,如果你想免費快速提升手機操作的流暢度,將“窗口動畫縮放”、“過渡動畫縮放”和“動畫程序時長縮放”從默認(rèn)的1x修改為0.5x即可(圖1),簡單又快捷。
而引言中提到的“玄學(xué)曲線”,就是開發(fā)者選項中隱藏的功能之一,也是用來幫助Android開發(fā)者找到界面中渲染問題的小工具。
怎么激活玄學(xué)曲線
需要注意的是,不同品牌的手機對開啟“玄學(xué)曲線”的選項名稱可能略有區(qū)別?!靶W(xué)曲線”的英文原名是“Profile GPU Rendering”,而國內(nèi)手機品牌會將其翻譯為“GPU顯示配置文件”或“GPU呈現(xiàn)模式分析”。
以ZUK手機為例,想激活“玄學(xué)曲線”,就需要找到并點擊開發(fā)者選項中的“GPU呈現(xiàn)模式分析”,并將其設(shè)定在“在屏幕上顯示為條形圖”(圖3)。然后,你就會發(fā)現(xiàn)手機屏幕上出現(xiàn)了無數(shù)道彩色的線條,由這些線條組成的波形圖,就是本文的主題“玄學(xué)曲線”了(圖4)。
當(dāng)應(yīng)用程序在運行時,我們會看到屏幕下方出現(xiàn)了一排由紅、橙、藍(lán)三色組成的柱狀圖(由無數(shù)道線條組成),從左到右動態(tài)地顯示。每一道垂直的線條代表一幀的渲染,隨著需要渲染的幀數(shù)越來越多,我們也就可以觀察到這段時間幀率的變化了。
玄學(xué)曲線中的標(biāo)記線
Android系統(tǒng)默認(rèn)將每秒60幀設(shè)定為滿幀,按照1秒÷60幀的公式可以得到16ms(毫秒)時為滿幀的界限。在玄學(xué)曲線中,有一道橫向顯示且貫穿整個屏幕的綠色線條,它就代表著16ms的標(biāo)記線(圖5)。理論上講,只要有一道豎線超過了綠色的標(biāo)記線,就代表著你看到的動畫有丟幀現(xiàn)象產(chǎn)生。
不過,理論和實際總是存在差異的(圖6),所以盲目迷信“只要三色玄學(xué)曲線越過標(biāo)記線就卡”顯然是有失偏頗的。
玄學(xué)曲線中的彩色線
在“玄學(xué)曲線”中,紅色的線條代表執(zhí)行時間,也就是CPU將所需要繪制的任務(wù)交給GPU,再由GPU渲染到屏幕上所用的時間。因此,如果紅線超過了綠色標(biāo)記線并不一定代表卡頓,因為當(dāng)我們上網(wǎng)時,網(wǎng)頁上的圖片會根據(jù)網(wǎng)速的快慢,刷新(顯示)出來的速度也是有快有慢,很多圖片都需要等待幾秒才能完全顯示,你能說手機卡頓了幾秒嗎?
橙色線部分代表處理時間,也就是CPU告訴GPU渲染已經(jīng)完成的時間。但有時候當(dāng)GPU的任務(wù)太多時,往往不能第一時間反饋給CPU已經(jīng)獲悉渲染完成的信息。所以,橙色線越過綠色標(biāo)記線,只能代表GPU當(dāng)前占用率太高,也不見得出現(xiàn)了卡頓。
藍(lán)色線代表繪制時間,就是GPU完成CPU交給的渲染任務(wù)的時間。在玄學(xué)曲線中,只有藍(lán)色線超過綠色標(biāo)記線,才算真正抓到了丟幀卡頓的證據(jù)。
看到這里,相信你對玄學(xué)曲線已經(jīng)有了基本的認(rèn)識,它們存在的初衷是幫助開發(fā)者調(diào)試,通過對三色線的變化進(jìn)行有針對性的優(yōu)化。一套系統(tǒng)、一款應(yīng)用,只有在運行的絕大多數(shù)時間都能保持三色線不越過標(biāo)記線才算完美。
開發(fā)者選項的功能有待挖掘
除了本文涉及的提升流暢度、判斷流暢度的玄學(xué)曲線,Android系統(tǒng)的開發(fā)者模式還隱藏了無數(shù)有趣的功能。比如,很多視力存在缺陷的色盲、色弱用戶,可以通過“模擬顏色空間”,讓屏幕的色彩按照自己的實際情況改變色彩的構(gòu)成(圖7),以便更好地看清屏幕上的內(nèi)容。