抓出卡頓元凶,從分析掉幀開始

2022-07-04 00:24:18 字數 2815 閱讀 5950

這次我們依舊來談談有關效能優化的話題,這次我們會用到google給我們提供的分析工具——systrace。如果你還不了解這個工具,最好先了解一下。google 官方文件:

我們還會用到乙個demo,用來對比卡頓和不卡頓的狀況。

demo執行起來會是這樣的:

流暢執行

模擬卡頓

這裡解釋一下,gif動畫表現得不是很完善,流暢執行的效果其實是每秒60幀,實際執行效果非常順暢。模擬卡頓的效果在每秒60幀的基礎上加了隨機時長的執行緒sleep時間。具體實驗**片如下所示:

流暢執行的**片

threadrun = true;

pbcurrent = 0;

demopb.setprogress(pbcurrent);

new thread(new runnable() catch (interruptedexception e)

if (pbcurrent > pb_max) else

message msg = new message();

msg.what = update_handler_key;

muihandler.sendmessage(msg);}}

}).start();

模擬卡頓的**片

thread2run = true;

pbcurrent = 0;

demopb.setprogress(pbcurrent);

new thread(new runnable() catch (interruptedexception e)

if (pbcurrent > pb_max) else

message msg = new message();

msg.what = update_handler_key;

muihandler.sendmessage(msg);}}

}).start();

更新ui部分**片

@override

public void handlemessage(message msg)

}

兩個按鈕分別對應上述兩個執行緒的使能,另外請注意:我們只是模擬卡頓,並非真的發生了卡頓。因此,在systrace的圖表中,沒有出現紅色或橙色的告警。

分別對上述兩種情況取systrace圖表,得到如下結果:

流暢執行的圖表

模擬卡頓執行的圖表

通過對比,我們可以看到上面二者之間的差別。流暢執行的圖表中,每一幀的繪製很均勻。差不多16.6ms一幀,也就是1000毫秒除以60幀,得到的16.6ms一幀。而模擬卡頓的圖表中,每一幀的繪製則不均勻,有的長達將近200ms。但由於是我們自身模擬的結果,並非實際卡頓,所以圖表中均為綠色的顯示。下面我們來看乙個真實的案例:

真實案例

上圖中,一幀本來應該是16ms完成的,然而卻花費了近60ms,用1000ms/60ms,我們得到近似16幀。而16幀的幀率已經是肉眼可見的卡頓了。

我們聚焦到上面真實的案例,放大看發生卡頓的位置:

我們發現,record view 的draw()方法花費了一些時間。

此外,還有一堆瑣碎的小片段,我們進一步放大觀察,會發現:

這裡居然還載入了一堆貼圖。

至此,我們就抓到了導致掉幀的「元凶」,下一步就是結合源**進行優化了。

為什麼16ms一幀?

16ms是1000ms/60幀得到的結果,60幀對於人眼而言已經是很流暢的體驗了。而最低的限度是33ms一幀,也就是1000ms/30幀得到的結果。如果時間再長一點的話,就有可能發生人眼可見的卡頓了。

延伸一點,也就是說,如果嚴格要求60幀,但是中間掉了1幀,就相當於33ms畫一幀,此時,雖然掉幀,但是人眼還是可接受的。

如何快速定位卡頓位置

首先是確保發生了卡頓。一般而言,沒有發生卡頓的圖表,網頁的圖表會是綠色的,發生卡頓的則是紅色的。

然後我們使用鍵盤+滑鼠的組合來找位置,鍵盤的快捷鍵對應w、s、a、d。ad相當於拖拽時間滑塊,ws相當於縮放。

最後我們用滑鼠來選取相應的時間範圍即可。

今天的分享到此,希望對你有幫助。

mysql定期卡頓 MySQL卡頓和優化

1.若是是你,你怎麼處理慢查詢引發的問題,而且在之後避免這種狀況發生?sql 對於mysql的慢查詢問題,一般咱們是這麼幹的 1 開啟mysql伺服器的慢查詢記錄功能 mysql set global slow query log on mysql show variables like slow ...

關於win系統滑鼠卡頓 聲音卡頓問題

win7 64 thinkpad e420 老機 重灌系統發現聲音卡頓等問題 搜尋一下解決方案發現都沒有效果 1 改登錄檔,禁用服務法 聲音出現卡頓停頓的現象是這樣的 聽歌,開啟其他應用程式或者出現使用者安全控制提示的時候,聲音就出現卡頓現象。折騰了半天包括驅動,聲音屬性設定等都無法解決,最後度娘出...

myeclipse 開啟卡頓

做開發的同學們或多或少的都會遇到eclipse啟動到一定程度時,就進入灰色無響應狀態再也不動了。啟動畫面始終停留在loading workbench狀態。反覆重啟,狀態依舊。多數情況下,應該是非正常關閉eclipse工作區的檔案狀態錯誤所導致的。在工作區目錄中,有乙個.metadata目錄,裡面是工...