DirectFB 原始碼解讀之雙快取實現

2021-09-30 07:34:34 字數 1744 閱讀 3404

)及作者郵箱(

[email protected])

雙快取是畫圖時乙個常用的技術,它的基本原理是在其中乙個快取中作圖,完成後提交顯示,同時在另一塊快取中繼續作圖,這樣兩塊快取交替畫圖-顯示,實現了兩者的同步進行,提高了效率。

在directfb中,乙個快取實際就是一塊記憶體。dfb支援兩種快取分配方式:

(1)使用者自己分配,並在createsu***ce是將該記憶體位址傳遞給dfb,這種方式需要在createsu***ce時指定dscaps_premultiplied屬性

(2)dfb自動分配,大部分使用者使用這種方式。

directfb支援雙快取或三快取,使用者程式設計時,只需在呼叫dfb->

createsu***ce 時指定dscaps_double或dscaps_triple即可。而除此以外,多快取對於使用者是透明的。

下面是乙個簡單實現動畫的例子:一條橫線自上而下的移動(假定我們讓dfb自動分配快取並設定它是雙快取的):

dfb->createsu***ce(dfb, &sdsc, &su***ce);

for(i=0;i<100;i++)

su***ce->release(su***ce);

第一步createsu***ce(),建立乙個su***ce物件並初始化這個物件的函式指標,同時設定該su***ce的一些基本屬性如大小,格式(pixel format)等。但是並沒有為該su***ce建立快取,也就是沒有實質的記憶體分配。

第一次呼叫drawline時,首先會呼叫dfb_gfxcard_state_check檢查和設定各個狀態,其中會呼叫dfb_su***ce_get_buffer得到目標buffer,即在那個快取上畫。它的**如下:

dfb_su***ce_get_buffer( coresu***ce           *su***ce, coresu***cebufferrole  role )

關於這個函式:

role即uffer的角色,有三種csbr_front(0), csbr_back(1),csbr_idle(2),分別表示前快取,後快取和閒置快取。

通常,總是在前快取中畫,即role總是csbr_front。另外,前快取和後快取只是乙個邏輯概念,它所指向的buffer是交替變化的,

su***ce->buffers是乙個buffer的陣列,buffers[0]指向第乙個buffer物件,buffers[1]指向第二個buffer物件,等等。該陣列的大小是max_su***ce_buffers,即6個。

su***ce->buffer_indices是乙個整數陣列,它的大小也是6,我個人認為不需要這個變數,仍然可以工作,看不出他的真正用途是什麼。

su***ce->num_buffers記錄了這個su***ce有效的buffer數量,如果指定了dscaps_double,那它就是2;如果指定了dscaps_triple,那它就是3.

su***ce->flips是乙個整數值,系統每次呼叫flip函式,這個值就會加1。

這樣,我們就很容易理解上面的那個函式。例如,第一次drawline時,呼叫dfb_su***ce_get_buffer(), role是frone, 即0, flips = 0, 則返回的就是第乙個快取;呼叫flip顯示之後,第二次畫圖時,role仍然為front,因為使用者總是在前buffer中作圖,而flips 變成了 1,這時上面的函式返回的是第二個快取。第三次畫圖時,又返回第二個buffer,依次類推。

最終得到的buffer記憶體位址將傳遞給實際的作圖函式,並由它在記憶體中完成作圖。

這就是dfb雙(多)快取的實現

Qwt原始碼解讀之QwtInterval 類

qwtinterval 類表徵乙個區間,這個區間由兩個double型別的上限值max和下限值min所表示。它可以表示 min,max min,max min,max 和 min,max 等4種情況。分析 cpp view plain copy class qwt export qwtinterval...

metaq原始碼解讀之FetchManager

fetchmanager 請求管理器介面。既然是管理器,就需要知道管理的物件是什麼?fetchrequest 管理的是一次次的請求。既然是管理器,就需要給被管理者提供容所?fetchrequestqueue 請求delay queue。既然是管理器,就需要有管理實施者?fetchrequestrun...

Opencv 原始碼解讀之 ImageEncoder

imagedecoder類 imagedecoder這個類,這個類其實就是乙個影象資料的解析類。且看下面的源 class baseimagedecoder 這就是我們要找的imagedecoder類 int width const int height const int type const vi...