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 的情況,顯示均正常了。

以前一直認爲:提交一次之後,顯卡自動使用該數據顯示,直到有新的數據提交爲止。而實際情況是需要不停的提交,否則屏幕就黑了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章