gtk - 使用 GdkFrameClock 将 GtkDrawingArea 与屏幕刷新率同步

标签 gtk screen gtk3 gdk vsync

背景

我想使用GdkFrameClock将小部件的更新与屏幕刷新率同步。这是为了在 LCD 屏幕上进行视觉刺激响应测量(因此需要尽可能接近精确的帧同步以保证信号的纯度)。

我已经阅读了该类的文档,但其范围有限;我缺少对 GdkFrameClock 在 GTK 世界中的地位的一些总体理解。仔细阅读 GitHub 上 GTK 源代码树中的演示对我来说毫无结果。

问题

假设我可以,我如何使用GdkFrameClock来同步更新GtkDrawingArea(假设开罗)屏幕刷新率?

如果我不能GdkFrameClock的用途是什么?

最佳答案

我没有愤怒地使用过GdkFrameClock,只是为了进行一点测试,但以下内容似乎很简单并且对我有用:

  1. 调用 gtk_widget_add_tick_callback(),传递您想要在每次刷新时运行的函数
  2. 每秒大约 60 次(或根据您的系统而定),您的回调将被调用
  3. 完成后,调用 gtk_widget_remove_tick_callback() 或从回调中返回 FALSE 以停止接收更新。

在第 2 步中,您将传递正在使用的 GdkFrameClock,因此您可以调用 gdk_frame_clock_get_frame_time() 来获取准确的帧时间戳,或使用 gdk_frame_clock_get_timings( )GdkFrameTimings API 可以做更多有趣的事情。

以下 Vala 代码(我确信可以轻松转换为 D :-))显示了这一点:

private static bool on_frame_tick(Gtk.Widget widget, Gdk.FrameClock frame_clock)
{
    print("Got frame tick with timestamp %lld\n", frame_clock.get_frame_time());

    return true; // Keep going
}

void main(string[] args)
{
    Gtk.init(ref args);

    var w = new Gtk.Window(Gtk.WindowType.TOPLEVEL);
    w.add_tick_callback(on_frame_tick, null);
    w.show_all();

    Gtk.main();
}

请注意,根据 the docs ,您需要在处理程序中调用 gtk_widget_queue_draw() (或 queue_draw_area()),让 GTK 实际执行重绘。这将依次调用相关小部件的 draw() 函数。

因此,我要做的就是将帧计时信息保存在我的刻度回调中,调用 queue_redraw(),然后在 draw()< 中使用保存的计时信息 我的 GtkDrawingArea 的实现。

关于gtk - 使用 GdkFrameClock 将 GtkDrawingArea 与屏幕刷新率同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19342087/

相关文章:

android - 在Android上关闭屏幕时以编程方式关闭屏幕

python - 如何使用 Python 将 BeautifulSoup.Tag 设置为 Gtk3 中的标签

c++ - gtkmm 3 窗口 64 位

c - 如何在Gtk中组合accel键?

c# - 无需使用 API 或 WMI 即可获取监视器显示名称?

ios - 如何在 iOS App 中自定义屏幕亮度?

python - 如何使用python在特定桌面上显示程序窗口

python - GTK3 ComboBox 显示 TreeStore 中的父项

linux - 如何禁用 GtkMenuItem?

c - 当应用程序随启动应用程序一起启动时,没有按钮单击声音