Android FrameBuffer 中绘图的简单例子

1,调用linux函数打开framebuffer设备文件 fp = open ("/dev/graphics/fb0",O_RDWR);
    打开上面的设备文件后,利用内存映射,可以实现向framebuffer写数据来刷新屏幕。
但是现在有一个问题。貌似Android系统自己也会刷新屏幕,而且往设备文件里写的数
据,也不知道什么时候能刷新。

    手机上试过的,移动屏幕会一闪一闪,有时候屏幕上会一直留下自己画的,有时候,
自己画的会消失的无影无踪,只有再次滑动屏幕,才会显示出来。而且,一个点,一个
点的间隔,特别大,不像屏幕本身那么细腻。刚接触显示这一块,不懂,希望懂得人过
来交流交流。

    贴上自己的代码和Android.mk,帮你们节省时间。

lcd.c

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <linux/fb.h>
  6. #include <sys/mman.h>
  7.  
  8. int main () {
  9.     int fp=0;
  10.     struct fb_var_screeninfo vinfo;
  11.     struct fb_fix_screeninfo finfo;
  12.     int screensize=0;
  13.     char *fbp = 0;
  14.     unsigned int x = 0, y = 0;
  15.     int location = 0;
  16.     int bytes_per_pixel;
  17.  
  18.     int a = 3;
  19.     int b = 4;
  20.     int r = 0;
  21.  
  22.     fp = open ("/dev/graphics/fb0",O_RDWR);
  23.  
  24.     if (fp < 0){
  25.         printf("Error : Can not open framebuffer device\n");
  26.         exit(1);
  27.     }
  28.  
  29.     if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
  30.         printf("Error reading fixed information\n");
  31.         exit(2);
  32.     }
  33.     if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
  34.         printf("Error reading variable information\n");
  35.         exit(3);
  36.     }
  37.     bytes_per_pixel = vinfo.bits_per_pixel / 8;
  38.     screensize = vinfo.xres * vinfo.yres * bytes_per_pixel;   //单帧画面空间  单位:字节
  39.     printf("x=%d  y=%d  bytes_per_pixel=%d\n", vinfo.xres, vinfo.yres, bytes_per_pixel);
  40.     printf("screensize=%d\n", screensize);
  41.  
  42.  
  43.  
  44.     /*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/
  45.     fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
  46.     if ((int) fbp == -1)
  47.     {
  48.          printf ("Error: failed to map framebuffer device to memory.\n");
  49.          exit (4);
  50.     }
  51.     /*这是你想画的点的位置坐标,(0,0)点在屏幕左上角*/
  52.     while(1) {
  53.  
  54.         x = 0;
  55.         y = 0;
  56.         for(x = 0; x < vinfo.xres; x++) {
  57.             y = a * x + b;
  58.             if ( y > vinfo.yres)
  59.                 break;
  60.  
  61.             location = x * bytes_per_pixel + y  *  finfo.line_length;
  62.  
  63.             *(fbp + location) = 0;  /* 蓝色的色深 */  /*直接赋值来改变屏幕上某点的颜色*/
  64.             *(fbp + location + 1) = 255; /* 绿色的色深*/   /*注明:这几个赋值是针对每像素四字节来设置的,如果针对每像素2字节,*/
  65.             *(fbp + location + 2) = 0; /* 红色的色深*/   /*比如RGB565,则需要进行转化*/
  66.             *(fbp + location + 3) = 0;  /* 是否透明*/ 
  67.         }
  68.        
  69.         usleep(40);
  70.     }
  71.     munmap (fbp, screensize); /*解除映射*/
  72.     close (fp);    /*关闭文件*/
  73.  
  74.     return 0;
  75.  
  76. }
  77.  

复制代码

Android.mk

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3.  
  4. LOCAL_SRC_FILES:= lcd.c
  5.  
  6. LOCAL_MODULE := lcd
  7. LOCAL_MODULE_TAGS := optional
  8. include $(BUILD_EXECUTABLE) 
  9. #include $(BUILD_SHARED_LIBRARY) 
  10. #include $(BUILD_STATIC_LIBRARY) 
Android framebuffer是指在Android系统用于显示图像的一种技术。它使用framebuffer设备文件来管理显示屏的像素数据,并通过SurfaceFlinger作为屏幕合成引擎将图像写入到framebuffer。在Androidframebuffer设备文件通常位于/dev/graphics/fb0或/dev/graphics/fb1等路径下。打开可用的framebuffer设备是操作framebuffer的主要步骤之一。 SurfaceFlinger负责管理来自各个窗口的Surface对象,并将它们写入到framebuffer。它使用前buffer来合成图像,后buffer来绘制图像。一旦绘制完成,Android通过页翻转操作,交换Y轴坐标的偏移量,选择不同的buffer。如果虚拟Y轴分辨率大于实际Y轴分辨率,说明framebuffer可以直接使用双缓冲机制。否则,后buffer需要复制到前buffer,这可能导致页交换延迟。为了提高系统性能,framebuffer驱动最好提供双缓冲机制。 总结来说,Android framebuffer是一种用于显示图像的技术,在Android系统使用framebuffer设备文件来管理显示屏的像素数据,并通过SurfaceFlinger作为屏幕合成引擎将图像写入到framebuffer。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android Framebuffer介绍及使用](https://blog.csdn.net/wx_962464/article/details/77943919)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值