Shisheng Chen
Shisheng Chen
> 嵌入式Linux系统用awtk-linux-fb编译,交叉编译配置在awtk-linux-fb/awtk_config.py中。 哦,要加编译参数 LINUX_FB=true,之前没留意。 awtk-linux-fb/awtk_config.py中的copySharedLib函数应该要修改下,否则有些库没有复制过来
> 双缓冲需要等垂直同步, 如果每帧渲染时间都超出16ms, 则帧率只有一半, 三缓冲可以得到一定的缓解 > > https://www.bilibili.com/video/BV1FK4y1x7bk?spm_id_from=333.999.0.0 双缓冲需不需要进行垂直同步,要看实现方式:如果硬件本身支持双缓冲就不需要垂直同步;如果硬件不支持双缓冲即双缓冲是由软件实现的才需要垂直同步。
> 太专业了,什么是垂直同步? `ioctl(fb->fd, FBIO_WAITFORVSYNC, &dummy); ` 就是等待RGB接口时序上的VSYNC信号到来后才刷屏。
* 双缓冲模式下是不需要等待垂直同步信号的,题主用`fbset`进行设置应该没有生效,因为双缓冲模式需要内核驱动在垂直同步时响应垂直同步中断来切换LCD所使用的缓存; * 在单缓冲模式避免界面撕裂的做法就是要避免更新缓存的时间线跟LCD时序上刷新一帧的时间线交叉; * LCD时序上,VSYNC信号到来后,还要经过VSPW(垂直同步宽度)和VBPD(垂直后沿)信号之后才真正开始刷新一帧; * 单缓冲模式下的垂直同步有多种情况: - 缓存更新的时长小于LCD刷新一帧的时长:VSYNC信号到来后就立刻更新缓存,因为缓存更新跑得快而LCD刷新既会起步晚也跑得慢,所以两者不会相遇,界面就不会撕裂; - 缓存更新的时长稍大于LCD刷新一帧的时长:即缓存更新跑得比LCD时序慢,此时如果`VSYNC信号到来后就立刻更新缓存`,LCD时序虽然起步晚但它跑得更快迟早会追上缓存更新从而导致界面撕裂;所以这种情况应该在VSYNC信号到来后等待一段时间让LCD时序过了VSPW跟VBPD后再更新缓存才不出现界面撕裂的情况。 - 缓存更新的时长明显大于LCD刷新一帧的时长:即缓存更新横跨两个LCD显示帧的话就避免不了界面撕裂了。
> 可以提供一个简单的测试例子吗? 最近有点忙,改天有空搞个小demo测试下
可以参考demouiold里的 [draggable](/zlgopen/awtk/tree/master/design/default/ui/draggable.xml)
看了下源码,AWTK那边需要使能SDL2的`SDL_SYSWMEVENT`事件,并在主循环中处理并分发此事件,然后像Qt那样对窗口句柄注册插拔事件过滤器。或者在注册插拔事件过滤器时才使能`SDL_SYSWMEVENT`事件。
需要调用win32 API `RegisterDeviceNotification`对窗口注册插拔事件过滤器才会收到插拔事件,该函数的第一个参数为窗口句柄。 我在AWTK之外进行单独测试时用如下代码进行注册,经测试是可以收到插拔事件的,可参考下: 其中`hWnd`为当前的窗口句柄 ```C static const GUID GUID_DEVINTERFACE_LIST[] = { // GUID_DEVINTERFACE_USB_DEVICE {0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}}, // GUID_DEVINTERFACE_DISK {0x53f56307, 0xb6bf, 0x11d0,...
可以使用combo_box_item 控件作为item并设置其feedback style
AWStudio第一次运行时为何要超级用户权限?这是要做什么动作? 