天天看點

07.顯示系統:第005課_Vsync機制:第001節_黃油計劃_三個方法改進顯示系統

在看高清電影的時候,需要幀率達到60fps(一秒顯示60幅圖畫,即16毫秒顯示一張圖檔),我們看起來才會比較舒服,流暢。在android4.1之前,都是通過2個buf進行顯示的,或者更加多個。前面已經提到過一個buf進行顯示存在的問題。

但是又兩個或者多個buf也會存在缺陷:

07.顯示系統:第005課_Vsync機制:第001節_黃油計劃_三個方法改進顯示系統

上圖是沒有Vsync機制的顯示圖示。其上黃色區域,每個間隔代表16ms,藍色後綠色代表buf.當cup顯示第一個buf的時候,同時也應該填充第二個buf,但是又時候。cpu會偷懶,沒有及時的去填充第二個buf,導緻顯示的還是之前的buf。這種情況如果比較頻繁,會導緻我們的視訊看起來比較卡。

其cpu沒有被強制在Vsync處開始工作,下面是多次改進的流程圖:

07.顯示系統:第005課_Vsync機制:第001節_黃油計劃_三個方法改進顯示系統

改進的思路很簡單,當Vsync到來的時候,cpu,gpu必須工作(被強制),這樣就變成了第二幅圖示。但是這是理想的狀态,如果cpu,或者gpu中有一個掉鍊子了怎麼?

如上圖中的第三個圖示,假設某個時刻,GPU生病了,要做的工作太多克,沒有忙過來,沒有能及時完成。可以看到圖示。綠色的框超過了時間點,但是沒有辦法,這樣就産生了一個jankel(沒有buf存放新資料),導緻下個周期沒有事情可做。并且會産生蝴蝶效應,不停的産生jankel。

該進的思路就是增加一個buf,變成了最後一個圖示。相當于溜了一個備用的buf。

最後還有一個Vsync虛拟化的改進,分為Vsync-APP,Vsync-SF(surfaceFlinger)。前面提高,改進之後,gpu,cpu被強制在每個Vsync到來是工作,我們知道應用程式構造好資料隻夠要發送給surfaceFlinger:

07.顯示系統:第005課_Vsync機制:第001節_黃油計劃_三個方法改進顯示系統

surfaceFlinger會使用cpu,gpu進行渲染,即生成畫面,最後發送給Disply,假如三個都是在Vsync到來時同時開始工作:

07.顯示系統:第005課_Vsync機制:第001節_黃油計劃_三個方法改進顯示系統

Vsync到來APP需要更新畫面(填充buf),這個更新的畫面需要發送給surfaceFlinger,但是surfaceFlinger在下個Vsync才能進行處理(合并新畫面,把APP1的畫面與其他的畫面合成),合并好的畫面在下一個Vsync到來是才能顯示。這樣的話,圖檔更新到圖檔顯示,已經過去了兩個Vsync,即36毫秒。這樣的話,會使我們的應用程式感覺非常的卡。

那麼怎麼解決這個問題呢?他們的問題在于,所有機關在Vsync到來時,才開工。比如。即使APP已經準備好更新的畫面了,surfaceFlinger也沒有立即開工,他在等到Vsync到來時才開工。那如果能讓surfaceFlinger及時開工,不就解決這個問題了嗎?

繼續閱讀