zlgopen / awtk-linux-fb

awtk port for linux framebuffer
108 stars 49 forks source link

使用最新awtk-linux-fb(3月5号之后的),在实际环境中运行发现,撕裂现象非常严重,3月5号之前的版本不存在该问题,请知悉 #56

Open hantianheng opened 3 years ago

WNsACE commented 3 years ago

目前你是用什么版本?3月16号有针对垂直同步的问题有修复过

sohide commented 3 years ago

@hantianheng 在我们测试的设备上没有出现类似的问题,麻烦你帮确认一下在你的设备,下面代码跑的是哪个流程: awtk-linux-fb/awtk-port/lcd_linux/lcd_linux_fb.c line:262

static lcd_t* lcd_linux_create(fb_info_t* fb) {
  if (fb_is_1fb(fb)) {
    return lcd_linux_create_flushable(fb);
  } else {
    return lcd_linux_create_swappable(fb);
  }
}

(请用最新版本的awtk-linux-fb测试,谢谢)

hantianheng commented 3 years ago

目前你是用什么版本?3月16号有针对垂直同步的问题有修复过 我使用的是3月5号的到现在的最新版本

@hantianheng 在我们测试的设备上没有出现类似的问题,麻烦你帮确认一下在你的设备,下面代码跑的是哪个流程: awtk-linux-fb/awtk-port/lcd_linux/lcd_linux_fb.c line:262

static lcd_t* lcd_linux_create(fb_info_t* fb) {
  if (fb_is_1fb(fb)) {
    return lcd_linux_create_flushable(fb);
  } else {
    return lcd_linux_create_swappable(fb);
  }
}

(请用最新版本的awtk-linux-fb测试,谢谢)

好的,我等下去确认下,谢谢你的回复

hantianheng commented 3 years ago

目前你是用什么版本?3月16号有针对垂直同步的问题有修复过

你好,我目前使用的是最新的版本,我看到了3月9号将垂直同步的功能又加了上去,但是3月16号的版本中没有看到关于垂直同步的修复啊。

WNsACE commented 3 years ago

那你更新到最新版本的 linux-fb 还是出现撕裂问题?你的屏幕是单缓存还是多缓冲的?

hantianheng commented 3 years ago

那你更新到最新版本的 linux-fb 还是出现撕裂问题?你的屏幕是单缓存还是多缓冲的?

我使用的是单缓存的

fb_info_t: /dev/fb0 xres=480 yres=480 xres_virtual=480 yres_virtual=480 bits_per_pixel=32 line_length=1920 fb_info_t: red(16 8) green(8 8) blue(0 8) xpanstep=1 ywrapstep=0 fb_size=921600 fb_total_size=921600 fb_nr=1 smem_len=921600 fb_open clear fb_open ok sh: dmidecode: not found ratio=1.000000 480 480 font_stb_create default 0x7c200:8 font default : use mmmap mmmap 0xb5971000:3183684 tslib_run:114: open tslib successful, filename=/dev/input/event0 font_stb_create default 0x7c200:8 font default : use mmmap mmmap 0xb5971000:3183684

hantianheng commented 3 years ago

@hantianheng 在我们测试的设备上没有出现类似的问题,麻烦你帮确认一下在你的设备,下面代码跑的是哪个流程: awtk-linux-fb/awtk-port/lcd_linux/lcd_linux_fb.c line:262

static lcd_t* lcd_linux_create(fb_info_t* fb) {
  if (fb_is_1fb(fb)) {
    return lcd_linux_create_flushable(fb);
  } else {
    return lcd_linux_create_swappable(fb);
  }
}

(请用最新版本的awtk-linux-fb测试,谢谢)

你好,跑的是lcd_linux_create_flushable() 这个流程

sohide commented 3 years ago

单缓冲(lcd_linux_create_flushable) 的情况下,无法避免撕裂,如果可以建议用fbset指令调整为双缓冲,但是否能设置成功取决于你的板子上的系统平台,比如你的lcd是800x480x16:

sudo fbset -g 800 480 800 960 16

如果只能用单缓冲的情况,可以尝试修改 awtk-linux-fb/awtk-port/lcd_linux/lcd_linux_fb.c line:143

static ret_t lcd_mem_linux_flush(lcd_t* lcd) {
  fb_info_t* fb = (fb_info_t*)(lcd->impl_data);

  if (lcd_mem_linux_flush_defalut) {
    lcd_mem_linux_flush_defalut(lcd);
  }
  fb_sync(fb);
  return RET_OK;
}

也就是把fb_sync放到lcd_mem_linux_flush_defalut的后面,麻烦你测试一下情况是否有好转

hantianheng commented 3 years ago

单缓冲(lcd_linux_create_flushable) 的情况下,无法避免撕裂,如果可以建议用fbset指令调整为双缓冲,但是否能设置成功取决于你的板子上的系统平台,比如你的lcd是800x480x16:

sudo fbset -g 800 480 800 960 16

如果只能用单缓冲的情况,可以尝试修改 awtk-linux-fb/awtk-port/lcd_linux/lcd_linux_fb.c line:143

static ret_t lcd_mem_linux_flush(lcd_t* lcd) {
  fb_info_t* fb = (fb_info_t*)(lcd->impl_data);

  if (lcd_mem_linux_flush_defalut) {
    lcd_mem_linux_flush_defalut(lcd);
  }
  fb_sync(fb);
  return RET_OK;
}

也就是把fb_sync放到lcd_mem_linux_flush_defalut的后面,麻烦你测试一下情况是否有好转

你好,我将fb_sync()放到了后面,撕裂的现象依然存在, 我按照你的方法设置成了双缓冲模式,撕裂现象几乎就看不到了,不过好像是因为我的屏幕不支持480*960,所以当我将分辨率设高之后,会产生“fbset: FBIOPUT_VSCREENINFO: Invalid argument”的提示。将分辨率设低就不会出现该问题了。

sohide commented 3 years ago

将fb_sync()放到后面与3月5号前的逻辑是一样的,想不明白为什么你之前没有撕裂,或许你可以按之前的代码修改lcd_linux_create_flushable的逻辑,再测试看看

hantianheng commented 3 years ago

你好,当我把awtk_config.py中的-DHAS_FAST_MEMCPY去掉之后,撕裂有了很大的改善,然后我再将fb_sync放到lcd_mem_linux_flush_defalut的后面,现在基本上和3月5号之前的版本一样了。

我在最新版本的基础上将-DHAS_FAST_MEMCPY去掉之后,在切换界面的过程中,当fps相对较高时(约30帧以上)不再有撕裂的现象,但是fps较低时(30帧以下,最低大约为12帧)依然存在撕裂的现象。

然后我在-DHAS_FAST_MEMCPY去掉之后的基础上,将fb_sync放到lcd_mem_linux_flush_defalut的后面,在切换界面时,即使fps很低的情况下撕裂现象也很少出现,有了很大的改善。

目前来看,可能是优化后的memcpy函数在我的实际环境上适配的并不好,不仅没有节省时间,反而拖慢了系统的运行速度。 然后就是拷贝显存和垂直同步的先后顺序,看来应该也是很重要的,这里我不是很理解具体原因。

请知悉

xianjimli commented 3 years ago

-DHAS_FAST_MEMCPY 表示使用系统提供的memcpy,去掉了就是使用AWTK提供的memcpy,也就是说明你系统自带的memcpy效率不高,你可以单独测试一下。

ufbycd commented 2 years ago
hantianheng commented 2 years ago

我不回啊