97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠(yuǎn)見教育科技集團(tuán) >> 新聞動(dòng)態(tài) >> Android資料 >> Android 雙緩沖局部渲染  
 
Android 雙緩沖局部渲染
分享到:

在Linux中,所有的設(shè)備被映射成文件進(jìn)行操作,為了更方便地操作顯存。Linux 2.2引入了幀緩沖設(shè)備這一特性。

幀緩沖設(shè)備提供了顯存的抽象描述。作為字符型設(shè)備,應(yīng)用程序通過定義好的接口可以訪問顯卡,而不必知道底層的物理顯存位置、換頁機(jī)制等操作細(xì)節(jié)。該設(shè)備使用特定的設(shè)備節(jié)點(diǎn),通常位于/dev目錄,如/dev/fb*。通常主設(shè)備號是29,次設(shè)備號定義幀緩沖的個(gè)數(shù)。Linux多支持32個(gè)幀緩沖設(shè)備,/dev/fb則為當(dāng)前默認(rèn)的幀緩沖設(shè)備,通常指向/dev/fb0,但在Android中,通常指向/dev/graphics/fb0。

目前的兩種幀緩沖設(shè)備標(biāo)準(zhǔn)為TGA、VESA。其中VESA采用更為廣泛。幀緩沖功能初被加入到Linux內(nèi)核,是為了顯示Linux的“企鵝”圖標(biāo)。

通過幀緩沖設(shè)備,用戶可以執(zhí)行讀寫屏幕、抓屏、mmap、I/O控制等操作。通過mmap操作,可以將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中,之后用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區(qū),這將提高渲染效率。通過I/O控制,用戶可以讀取/設(shè)定顯示設(shè)備的參數(shù),如分辨率、顯示顏色數(shù)、屏幕大小等。

在Android中,沒有采用X Server等解決方案,而是采用了直接操作幀緩沖的方式,同時(shí)引入了雙緩沖的概念(前端緩沖和后端緩沖),這有效地減少了通信間的開銷。

在幀緩沖中,有個(gè)關(guān)鍵的特性需要了解。通常對于屏幕的渲染是采用整屏的方式來渲染的,但很多時(shí)候,內(nèi)容只是在局部區(qū)域發(fā)生了變化,整屏的重繪在工作量上就顯得有些冗余。為了能進(jìn)行局部渲染,Android引入了copybit類(效果并不明顯),而雙緩沖的切換在位于fb_post函數(shù)中,如果由于某種原因無法完成前端緩沖和后端緩沖的切換,則直接將后端緩沖的內(nèi)容復(fù)制到前端緩沖中,在Android中的實(shí)現(xiàn)過程如下:

代碼:fb_post函數(shù)的實(shí)現(xiàn)

static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)
    {
    if (private_handle_t::validate(buffer)<0)
      return -EINVAL;
    fb_context_t* ctx=(fb_context_t*)dev;
    private_handle_t const* hnd=reinterpret_cast< private_handle_t const*>(buffer);
    private_module_t* m=reinterpret_cast< private_module_t*>(dev->common.module);
    if (m->currentBuffer) {
      m->base.unlock(&m->base, m->currentBuffer);
      m->currentBuffer=0;
    }
    if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
    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) {
      LOGE("FBIOPUT_VSCREENINFO failed");
      m->base.unlock(&m->base, buffer);
      return -errno;
    }
    m->currentBuffer=buffer;
    } else {
    void* fb_vaddr;
    void* buffer_vaddr;
    m->base.lock(&m->base, m->framebuffer,GRALLOC_USAGE_SW_WRITE_RARELY,0, 0, m->info.xres, m->info.yres,&fb_vaddr);
    m->base.lock(&m->base, buffer,GRALLOC_USAGE_SW_READ_RARELY,0, 0, m->info.xres, m->info.yres,&buffer_vaddr);
    memcpy(fb_vaddr, buffer_vaddr, m->finfo.line_length * m->info.yres);
    m->base.unlock(&m->base, buffer);
    m->base.unlock(&m->base, m->framebuffer);
      }
    return 0;
    }

如果前端緩沖和后端緩沖切換有問題,容易引起界面出現(xiàn)閃爍現(xiàn)象。

在Aurora中,幀緩沖的驅(qū)動(dòng)實(shí)現(xiàn)被放置在aurora\msm\msm\drivers\video\msm目錄下。在Android中,幀緩沖的驅(qū)動(dòng)實(shí)現(xiàn)被放置在hardware\libhardware\modules\gralloc目錄下。

 更多相關(guān)文章

·Android Overlay硬件加速
·Android OpenGL ES渲染方式
·Android Skia UI控件架構(gòu)
·Android Skia圖形渲染
·Android Skia 渲染概述