VSync訊號的虛擬化

2021-08-14 10:40:20 字數 2266 閱讀 6727



android 4.1(jelly bean)

引入了vsync(vertical syncronization)

用於渲染同步,使得

和su***ceflinger

可以按硬體產生的

vsync

節奏來進行工作。

圖1 vsync模型

上述模型存在以下問題:

1.對於一幀內容,必須先等

畫完了,

su***ceflinger

才能對其進行合併渲染。這樣對於同一幀內容,第乙個

vsync

訊號時的資料開始準備,第二個

vsync

訊號時su***ceflinger

工作,第三個

vsync

訊號時使用者看到內容,這樣就兩個

vsync period(

每個16ms)

過去了。這會影響使用者體驗。

2.計算機資源是有限的,大家一起做事,都搶資源,必然導致工作加倍的慢。

為了解決上述問題,增加系統的流暢性,

android 4.4(kitkat)

引入了vsync

的虛擬化,sf和

不再直接使用

hw vsync

。kitkat

建立了乙個

vsync

模型,該模型對硬體

vsync

進行取樣、處理,然後產生帶有相位偏移的兩個

vsync

訊號供sf

和使用。模型如下圖所示:

的pll模型

需要注意的是

dispsync

內部統計了產生的

sw vsync

和hw vsync

的誤差,在不需要

hw vsync

時會關閉

hw vsync

,在誤差太大的情況下會重

新使能hw vsync

,對hw vsync

進行重新取樣、更新模型引數,這樣

sw vsync

能與hw vsync

更加的精確,不至於誤差太大。

vsync

工作時序圖如下:

工作時序圖

這樣,和sf

既保持一定的節拍,又可以相互錯開,一前一後保持著節奏。需要注意的是其中兩個

phase offset

引數(即

vsync_event_phase_offset_ns

和sf_vsync_event_phase_offset_ns

)是可調的。

相關的類圖如下:

圖4 vsync

模型類圖

dispsync

類表示了乙個基於硬體

vsync

訊號的同步模型,它會根據從

hwcomposer

來的硬體

vsync

訊號的取樣來進行同步。其它兩個

eventthread

分別用了兩個不同的虛擬

vsync

訊號源(用

dispsyncsource

表示,其中包含了與真實

vsync

訊號的偏移),這兩個

vsync

訊號源就是被虛擬出來分別用於控制

和su***ceflinger

渲染的。在

eventthread

的執行緒迴圈中,如果有需要就會向

dispsync

註冊相應的

listener

。dispsyncthread

在主迴圈中會先通過已經向

dispsync

註冊的listener

計算下乙個要產生的虛擬

vsync

訊號還要多久,等待相應時間後就會呼叫相應

listener

的callback

函式。

EventThread執行緒對VSync的分發

eventthread執行緒對vsync的分發 前面提到,eventthread在接收到vsync後再將它們分發給感興趣的註冊者,分發的過程是在其執行緒迴圈threadloop函式中完成的。讀者也可以先閱讀後面一節內容,先了解感興趣的註冊者如何得到vsync通知以及系統中可能存在哪些感興趣的註冊者後...

半虛擬化和全虛擬化的區別

1.全虛擬化比半虛擬化技術先出來 2.全虛擬化,客戶機認為自己執行在硬體之上,優點 不需對客戶機作業系統進行修改 缺點 消耗資源大 3.半虛擬化,客戶機知道自己是執行在虛擬機器上,缺點 需要對客戶機作業系統進行修改,所以對不能修改的系統 windows系統 不支援 優點 消耗資源小效能好,4.隨著,...

KVM虛擬化虛擬機器支援虛擬化

一 開啟的時候需要關閉所有虛擬機器 首先檢查 kvm host 宿主機 母機 上的kvm intel模組是否開啟了巢狀虛擬機器功能 預設是開啟的 1 modinfo kvm intel grep nested parm nested bool 2 cat sys module kvm intel p...