我有一个使用GTK的C语言编写的应用程序(尽管这种语言对于这个问题可能不重要)。
此应用程序有一个全屏gtk_window和一个gtk_drawing_area对于绘图区域,我已经通过gtk_widget_add_tick_callback注册了一个tick回调,它只调用gtk_widget_queue_draw每个tick在绘图区域draw回调中,我定期更改整个窗口的颜色(例如,在1Hz时从黑色变为白色)。
假设在调用draw回调时,我想将窗口从黑色更改为白色我想知道在屏幕上实际绘制更改的精确时间(精确到毫秒)(理想情况下与CLOCK_MONOTONIC的单位相同)我不认为这与tick回调中可用的GdkFrameClock是一回事,据我所知,它是关于帧的时间,而不是帧实际显示在屏幕上的时间。
如果我只是在绘图回调中测量CLOCK_MONOTONIC时间,然后使用光电二极管测量实际更改是通过附加的A2D进行的,那么实际更改是显示被若干刷新间隔(在我的情况下,是3次屏幕刷新)延迟是可以理解的。
总结一下:如果我在GTK小部件draw回调中,有没有办法知道显示器实际以CLOCK_MONOTONIC为单位显示的时间或者,有没有一种方法可以阻止单独的线程,直到屏幕上实际显示我关心的特定重画(我可以像wait_for_screen_flip()那样编写的函数)?
更新:理想情况下,相同的解决方案适用于任何Linux合成器(X11或Wayland),这就是为什么我希望使用GTK/GDK解决方案,在这里,合成器被抽象出来。

最佳答案

我刚刚遇到了https://developer.gnome.org/gdk3/stable/gdk3-GdkFrameTimings.html#gdk-frame-timings-get-presentation-time它看起来就像你想要的,是Gdk的一部分我不知道如何使用它,也没有看到它的一些例子,但是https://developer.gnome.org/gdk3/stable/gdk3-GdkFrameTimings.html#gdk3-GdkFrameTimings.description
GdkFrameTimings中的信息对于视频与事件或音频流的精确同步以及测量应用程序显示的质量度量(例如延迟和抖动)非常有用。

关于c - GDK3/GTK3窗口更新的精确定时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48424320/

10-08 21:44