需求:
有的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邏輯 完成某種頁面功能。即實現了資料的非同步提交 區域性...