我没有GdkFrameClock
在愤怒中使用过,只是为了进行一点测试,但以下似乎很容易并且对我有用:
- 调用
gtk_widget_add_tick_callback()
,传递你想在每次刷新时运行的函数
- 大约每秒 60 次(或根据您的系统而定),您的回调将被调用
- 完成后,调用
gtk_widget_remove_tick_callback()
或FALSE
从回调中返回以停止接收更新。
在第 2 步中,您通过了GdkFrameClock
in 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
.