本文实例为借鉴 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 设备文件要稳定很多。