您尚未登录。

楼主 #1 2020-04-01 11:31:23

lixianjing
会员
注册时间: 2019-04-25
已发帖子: 105
积分: 101.5

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\n");
  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\n");

  return NULL;

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

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

遇到闪烁的朋友,请用最新代码验证一下。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn