Android 區域性重新整理

2021-05-23 02:52:15 字數 2304 閱讀 6504

需求:

有的lcd

是支援區域性重新整理的,所謂區域性重新整理也就是說,如果

ui層有更新,驅動才會去重新整理

framebuffer

的區域,並且只需要重新整理這塊髒的區域,這需要

lcd本身有乙個快取,能夠保持

framebuffer

上一幀的資料;

android 2.1架構:

android

本身是提供了這個區域性重新整理的支援的,不過預設並沒有啟用,如圖所示:

這個init

在執行的時候首先會查詢opengl所支援的擴充套件,看是否支援

egl_android_swap_rectangle

的擴充套件,預設的

opengl

的實現裡面是包含以下擴充套件的:

static char const * const gextensionstring  =

"egl_khr_image "

"egl_khr_image_base "

"egl_khr_image_pixmap "

"egl_android_image_native_buffer "

"egl_android_swap_rectangle"

"egl_android_get_render_buffer "

所以有了**

mflags |= swap_rectangle, 這個

flag

的意思就是在重新整理的時候需要把舊的髒區域減去新的髒區域,然後通過交換緩衝實現重新整理資料,預設的**都應該是走的這條路線;

後來的邏輯就是:

if (mnativewindow->isupdateondemand() )

這裡如果

if為真,就會把

partial_updates

的flag

置上,並且還有這樣的邏輯:

if (mflags & partial_updates)

mflags &= ~swap_rectangle ;

也就是說如果有了

partial_updates

的標誌,那麼會把

swap_rectangle

標誌給清掉;

好,現在回頭看看這個

mnativewindow->isupdateondemand()

的邏輯,如圖所示:

總結一下這個圖的意思就是說:如果從驅動讀上來的

finfo

裡面的reserved

陣列滿足上面的條件(當然這個條件由驅動來決定),那麼就會呼叫:

dev->device.setupdaterect = fb_setupdaterect;

而賦上了這個值後,

mupdateondemand

就會被設為真,於是在

init

函式裡面就會設上

partial_updates

的標誌,於是

android

的架構就開始支援區域性重新整理了,下面看看,這個區域性重新整理到底意味著什麼?

區域性重新整理的體現

:

如下圖所示:

這裡會呼叫到

framebuffer.cpp

裡面的fb_setupdaterect

函式,而在這裡面需要做的事情就是告訴驅動,你需要更新的區域,於是在

egl.cpp

裡面的swapbuffers

函式呼叫的時候會觸發

framebuffer.cpp

裡面的fb_post

函式呼叫,在那裡通過:

m->base.lock(&m->base, buffer,

private_module_t::priv_usage_locked_for_post,

0, 0, m->info.xres, m->info.yres, null);

const size_t offset = hnd->base - m->framebuffer->base;

m->info.activate = fb_activate_vbl;

m->info.yoffset = offset / m->finfo.line_length;

if (ioctl(m->framebuffer->fd, fbioput_vscreeninfo, &m->info)== -1)

實現內容的重新整理;

當然前提是驅動已經做好了這個準備;

頁面區域性重新整理

場景 頁面a使用第三方外掛程式c,如果頁面重新整理,c會重新初始化並且無法記錄之前的資訊。現在希望頁面的主要功能區b重新整理,但是c的資訊不要丟失。解決方案 b採用iframe方式引入到a中,b重新整理採用self.location.reload 這時b內容重新整理,而a中除了b以外的其他內容保持不...

RecycleView區域性重新整理

向指定位置插入item public final void notifyiteminserted int position 移除指定位置item public final void notifyitemremoved int position 更新指定位置item public final void...

ajax區域性重新整理

ajax執行原理 通過ajax向頁面發起請求,會將請求傳送給瀏覽器核心中的ajax引擎,ajax引擎會提交請求到伺服器端,在這段時間裡,客戶端可以任意進行任意操作,直到伺服器端將資料返回給ajax引擎後,會觸發你設定的事件,從而執行自定義的js邏輯 完成某種頁面功能。即實現了資料的非同步提交 區域性...