本文實例為借鑒 http://www.ixueyi.com/jingyan/1865079.html 該文檔后所寫。主要是android的gralloc操作顯存的模塊實例,如有不正確的地方歡迎指出謝謝。
Android幀緩沖區硬件抽象層模塊Gralloc的實現原理。
1. 分配一個匹配屏幕大小的圖形緩沖區
2. 將分配好的圖形緩沖區注冊(映射)到當前進程的地址空間來
3. 將要繪制的畫面的內容寫入到已經注冊好的圖形緩沖區中去,並且渲染(拷貝)到系統幀緩沖區中去
為了實現以上三個操作,我們還需要:
1. 加載Gralloc模塊
2. 打開Gralloc模塊中的gralloc設備和fb設備
其中,gralloc設備負責分配圖形緩沖區,Gralloc模塊負責注冊圖形緩沖區,而fb設備負責渲染圖形緩沖區。
直接看源碼:
1 framebuffer_device_t* fbDev; 2 alloc_device_t* grDev; 3 4 hw_module_t const* module; 5 buffer_handle_t handle; 6 gralloc_module_t const *mAllocMod; 7 void* vaddr; 8 int stride; 9 int err; 10 if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {//加載gralloc模塊 11 12 err = framebuffer_open(module, &fbDev); //打開fb設備 13 if(err) LOGE("couldn't open framebuffer HAL (%s)", strerror(-err)); 14 err = gralloc_open(module, &grDev); //打開gralloc設備 15 if(err) LOGE("couldn't open gralloc HAL (%s)", strerror(-err)); 16 17 err = grDev->alloc(grDev, display.w, display.h, HAL_PIXEL_FORMAT_RGBA_8888, GRALLOC_USAGE_HW_FB/*決定申請的是系統圖形內存還是普通內存*/, &handle, &stride); //分配圖形緩沖區 18 // err = grDev->alloc(grDev, 1024, 600, HAL_PIXEL_FORMAT_RGBA_8888, 0/*決定申請的是系統圖形內存還是普通內存*/, &handle, &stride); //分配圖形緩沖區 19 20 mAllocMod = (gralloc_module_t const *)module; 21 err = mAllocMod->registerBuffer(mAllocMod, handle); //映射內存到進程中 22 23 24 err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, display.w, display.h, &vaddr); 25 LOGE("++++++++++++++++> vaddr = %p\n", vaddr); 26 27 err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, 1024, 600, &vaddr); 28 LOGE("++++++++++++++++> vaddr = %p\n", vaddr);
29 //這就繪圖即可,將繪制的圖的內存直接拷貝到vaddr里面即可 30 bitmap.lockPixels(); 31 canvas->drawPath(path, paint); 33 memcpy(vaddr, bitmap.getPixels(), bitmap.getSize()); 34 bitmap.unlockPixels();
35 err = mAllocMod->unlock(mAllocMod, handle); 36 37 err = fbDev->post(fbDev, handle); //圖形緩沖區的渲染 38 39 err = mAllocMod->unregisterBuffer(mAllocMod, handle); //解除映射內存 40 41 grDev->free(grDev, handle);//釋放圖形緩沖區 42 43 gralloc_close(grDev);//關閉gralloc設備 44 framebuffer_close(fbDev);//關閉fb設備 45 }
這樣就可以直接繪圖顯示在屏幕上了,比直接操作/dev/graphics/fb0 設備文件要穩定很多。