首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weston wayland -改进屏幕截图(wl_display_roundtrip拦截超过一秒)

Weston wayland -改进屏幕截图(wl_display_roundtrip拦截超过一秒)
EN

Stack Overflow用户
提问于 2019-10-28 15:33:19
回答 1查看 502关注 0票数 2

我在armv7设备上使用韦斯顿。我正在使用weston的截屏模块不时地截取屏幕截图,但我注意到的是,当截图被截取时,显示的整个图像会冻结超过一秒钟,这会导致屏幕上出现严重的抖动。

我检查了weston源代码中的screenshot.c代码,并使用一些简单的性能测量(time now - time after)对其进行了编译,发现整个代码中只有一个地方导致了这种抖动:等待wl_display_roundtrip的while循环:

代码语言:javascript
复制
wl_list_for_each(output, &output_list, link) {
        output->buffer = create_shm_buffer(output->width, output->height, &output->data);
        weston_screenshooter_shoot(screenshooter,
                       output->output,
                       output->buffer);
        buffer_copy_done = 0;
        ms2 = ctimestamp();
        while (!buffer_copy_done)
            wl_display_roundtrip(display);
        fprintf(stderr, "while roundtrip took %llu ms\n", ctimestamp()-ms2);
    }
    fprintf(stderr, "foreach took %llu ms\n", ctimestamp()-oldMS);

整个for每个块的执行时间为901ms,而while循环的执行时间为896ms,因此大部分cpu时间用于等待往返。

有没有什么方法可以优化这个来消除屏幕上的抖动?在另一个线程中调用wl_display_roundtrip是否安全?或者,有没有什么异步的方式可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-11-21 17:23:28

wayland使用wl_display_roundtrip进行同步响应。此调用将阻塞,直到服务器服务器响应,必须小心使用,因为它可能会减慢系统速度,甚至在最坏的情况下可能会导致死锁。wl_display_roundtrip只在绑定注册表和获取全局对象和绑定时使用一次,因为客户端在没有获取对象接口的情况下无法执行任何操作。

对于非阻塞,您应该使用wl_display_dispatch

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58587104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档