zoukankan      html  css  js  c++  java
  • awtk-linux-fb 使用 double framebuffer 闪烁的问题

    awtk-linux-fb 使用 double framebuffer 闪烁的问题

    有朋友说 awtk-linux-fb 在某某平台闪烁很厉害,log 显示该平台使用的双帧缓冲。从代码和网上查的资料来看,目前的处理方法没有问题:无非就是通过 FBIOPUT_VSCREENINFO 或 FBIOPAN_DISPLAY 去修改 fb_var_screeninfo 的 yoffset。如:

        vi.yoffset = i * fb_height(fb);
        if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
          perror("active fb swap failed");
        } 
    

    百思不得其解,前几天找了一台 android 手机,把 zygote 进程停掉了,直接运行 AWTK 的程序,发现只要程序在刷新的时候,屏幕就有显示,停下来了屏幕就黑了。

    所以怀疑不管 GUI 有没有变化,都必须不停的调用 FBIOPUT_VSCREENINFO 向显卡提交显示请求。

    于是就开了一个独立的线程,来做这件事情:

    static void* display_thread(void* ctx) {
      uint32_t i = 0;
      uint32_t index = 0;
      fb_info_t* fb = &s_fb;
      int fb_nr = fb_number(fb);
      uint32_t size = fb_size(fb);
      lcd_mem_t* lcd = (lcd_mem_t*)ctx;
      struct fb_var_screeninfo vi = (fb->var);
    
      log_info("display_thread start
    ");
      while (!s_app_quited) {
        uint8_t* buff = fb->fbmem0 + size * i;
        uint32_t start = time_now_ms();
    
        vi.yoffset = i * fb_height(fb);
        pthread_mutex_lock(&s_mutex);
        memcpy(buff, lcd->offline_fb, size);
        pthread_mutex_unlock(&s_mutex);
    
        if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
          perror("active fb swap failed");
        }   
    
        index++;
        i = index % fb_nr;
      }
      log_info("display_thread end
    ");
    
      return NULL;
    

    在 android 设备上测试 2fb/3fb 的情况,显示均正常了。

    以前一直认为:提交一次之后,显卡自动使用该数据显示,直到有新的数据提交为止。而实际情况是需要不停的提交,否则屏幕就黑了。

  • 相关阅读:
    HTTP状态码
    Binary String Matching
    三个数从小到大排序
    java控制台输入带空格的字符串
    括号配对问题
    最小生成树之Prim算法(最原始最详细入门)
    hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)
    hdu 1848 Fibonacci again and again(尼姆博弈)
    hdu 1847 Good Luck in CET-4 Everybody!(入门SG值)
    hdu 1527 取石子游戏(威佐夫博弈)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13332977.html
Copyright © 2011-2022 走看看