EventThread執行緒對VSync的分發

2021-09-06 07:58:55 字數 1998 閱讀 6222

eventthread執行緒對vsync的分發

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

感興趣的註冊者首先需要建立到eventthread的連線,這個到eventthread的連線將儲存到eventthread的列表中。建立連線的**如下(下面的行56,參見檔案eventthread.cpp):

由於connection的父類中有refbase,所以其過載的onfirstref函式將被呼叫,後者又呼叫registerdisplayeventconnection函式將自己(即「連線」connection)註冊給eventthread(上面的行62);也就是說,每個連線建立時,都要將連線註冊到eventthread中,以讓eventthread給自己傳送vsync事件通知。由於連線可能會失效,所以eventthread中維護的是乙個連線的弱指標列表。在有新的連線註冊後,需要通知(行63)給threadloop迴圈,讓其從睡眠中醒來。

eventthread的threadloop函式的前面的**如下:

在內嵌的do-while迴圈(上面的行135~184)中,若註冊者指定了需要報告vsync(即行146處的connection中的count大於0),且vsync時間戳不為0(行153),則跳出該do-while迴圈,往下執行準備分發vsync事件;若不需要分發,且原來的時間戳不為0,表示vsync還是啟用狀態,因此去關閉vsync(行157);若時間戳為0,可能vsync原來已經是未啟用狀態,但若需要分發,則啟用vsync(行169);若螢幕關閉(不需重新整理輸出,vsync關閉)且需分發,那麼將睡眠片刻超時後的時間作為vsync時間戳(行178、179),然後在下乙個while迴圈中走到行153和160,跳出while迴圈,表示是軟體模擬的vsync事件;否則,即螢幕開啟和螢幕關閉但不需分發的兩種情形,這時,將進入睡眠等待狀態(行182)。在螢幕開啟狀態下,vsync很快就會到來(除非主動關閉了vsync),或者有新的感興趣者進行了註冊,或者註冊者請求改變了vsync分發頻率(見下一小節),這些都將被喚醒行182處的睡眠等待。在螢幕關閉且不需分發vsync的情況下,那麼就可以讓eventthread執行緒一直睡眠下去,不需醒來,直到螢幕開啟後被喚醒再次開始進行do-while迴圈的工作。

在跳出第乙個內嵌的迴圈後,表示有vsync需要分發報告,這時將計數器加1(下面的行187),記錄下時間戳資訊(行188);然後再次在for迴圈(行192~215)中檢查註冊者是否已經失效(行196)、報告頻率(是否這次該給某個註冊者報告,行200、201)等,若需要報告,則將該註冊者新增到待報告列表displayeventconnections中(行213)。在行216,若待報告列表為空,則繼續while迴圈,否則就往下執行,準備去分發vsync事件通知。

下面的**是threadloop的後面的**。首先準備好displayevent事件(當前也就只是vsync一種),包括型別和時間戳等資訊(行219~221)。再接著,在for迴圈(行224~246)中,逐個向待處理佇列中的連線傳送displayevent(vsync)事件(行228)。這就完成了對感興趣的註冊者的分發。

可見,threadloop首先根據註冊者和裝置(螢幕是否關閉)等情況判斷是否需要分發下乙個vsync;在不需要分發(如螢幕關閉並且也沒有接收者的情形)或完成任務後等待下乙個硬體或軟體模擬vsync到來時,則進入睡眠等待狀態;當被喚醒(如vsync到來)後,若需要報告分發,則將接收者新增到待處理佇列列表中,最後通過連線connection的postevent函式分發vsync顯示事件給註冊的接收者。

本文節選自《深入剖析android系統》一書

楊長剛著

電子工業出版社出版

專案 V0 0 4 執行緒同步

說到執行緒的問題,說實話,我也有點理不清。大約知道 操作 共享資料用 mutex鎖起 掛起等訊號用cond 一般是pthread mutex lock mutex pthread cond wait cond,mutex 其中是不是包含了乙個解鎖,等待的操作,等到了繼續鎖上?pthread mute...

IEEE 1588協議V1與V2對比

與ieee1588v1相比,ieee1588v2最大的改進 之處在於提出透明時鐘模型的概念。透明時鐘主要用於計算報文在網路交換設 備內部的延遲,解決級聯網路中的積累性誤差問題,從而提髙時鐘同步的精度。端到端透明時鐘和點到點透明時鐘 都可用於計算報文在網路交換裝置內部的駐留時間,但是二者對鏈路延遲的 ...

tensorflow queue 多執行緒與對列

我們必須要把資料先讀入後才能進行計算,假設讀入用時0.1s,計算用時0.9s,那麼就意味著每過1s,gpu都會有0.1s無事可做,這就大大降低了運算的效率。解決這個問題方法就是將讀入資料和計算分別放在兩個執行緒中,將資料讀入記憶體的乙個佇列 讀取執行緒源源不斷地將檔案系統中的讀入到乙個記憶體的佇列中...