4

背景

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

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

问题

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

如果我不能,那目的是GdkFrameClock什么?

4

1 回答 1

6

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

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

在第 2 步中,您通过了GdkFrameClockin use,因此您可以调用gdk_frame_clock_get_frame_time()以获取确切的帧时间戳,或者使用gdk_frame_clock_get_timings()APIGdkFrameTimings来做更多有趣的事情。

下面的 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();
}

请注意,根据文档,您需要在处理程序中调用gtk_widget_queue_draw()(或queue_draw_area())获取它以使 GTK 实际执行重绘。这将依次调用相关draw()小部件的功能。

因此,我要做的是将帧时间信息保存在我的滴答回调中,调用queue_redraw(),然后在draw()我的GtkDrawingArea.

于 2013-10-14T06:03:14.303 回答