Open hantianheng opened 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测试,谢谢)
目前你是用什么版本?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测试,谢谢)
好的,我等下去确认下,谢谢你的回复
目前你是用什么版本?3月16号有针对垂直同步的问题有修复过
你好,我目前使用的是最新的版本,我看到了3月9号将垂直同步的功能又加了上去,但是3月16号的版本中没有看到关于垂直同步的修复啊。
那你更新到最新版本的 linux-fb 还是出现撕裂问题?你的屏幕是单缓存还是多缓冲的?
那你更新到最新版本的 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 在我们测试的设备上没有出现类似的问题,麻烦你帮确认一下在你的设备,下面代码跑的是哪个流程: 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() 这个流程
单缓冲(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的后面,麻烦你测试一下情况是否有好转
单缓冲(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”的提示。将分辨率设低就不会出现该问题了。
将fb_sync()放到后面与3月5号前的逻辑是一样的,想不明白为什么你之前没有撕裂,或许你可以按之前的代码修改lcd_linux_create_flushable的逻辑,再测试看看
你好,当我把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函数在我的实际环境上适配的并不好,不仅没有节省时间,反而拖慢了系统的运行速度。 然后就是拷贝显存和垂直同步的先后顺序,看来应该也是很重要的,这里我不是很理解具体原因。
请知悉
-DHAS_FAST_MEMCPY 表示使用系统提供的memcpy,去掉了就是使用AWTK提供的memcpy,也就是说明你系统自带的memcpy效率不高,你可以单独测试一下。
fbset
进行设置应该没有生效,因为双缓冲模式需要内核驱动在垂直同步时响应垂直同步中断来切换LCD所使用的缓存;VSYNC信号到来后就立刻更新缓存
,LCD时序虽然起步晚但它跑得更快迟早会追上缓存更新从而导致界面撕裂;所以这种情况应该在VSYNC信号到来后等待一段时间让LCD时序过了VSPW跟VBPD后再更新缓存才不出现界面撕裂的情况。我不回啊
目前你是用什么版本?3月16号有针对垂直同步的问题有修复过