【发布时间】:2018-07-21 08:45:03
【问题描述】:
我用 GTK3 和 cairo 制作了一个非常简单的动画,但对于这个简单的图形来说它太慢了。我不明白为什么它这么慢。我尝试使用 gtk_widget_queue_draw_area,但结果是一样的,没有任何变化。 谁能解释一下,为什么这么慢,我该如何解决?
这是程序:
#include <gtk/gtk.h>
#include <cairo.h>
void draw(GtkWidget* widget, cairo_t* cr)
{
static int width, height,
posX = 0,
vX = 1;
GtkWidget* window = gtk_widget_get_toplevel(widget);
gtk_window_get_size(GTK_WINDOW(window), &width, &height);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_set_line_width(cr, 1);
cairo_rectangle(cr, posX, height/2, 1, 1);
cairo_stroke(cr);
if(posX + vX >= width || posX + vX == 0)
vX = -vX;
posX += vX;
gtk_widget_queue_draw(window);
}
int main(int argc, char** argv)
{
GtkWidget* window;
GtkWidget* darea;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(draw), NULL);
gtk_widget_show_all(window);
gtk_main();
}
【问题讨论】:
-
也许
gtk_queue_draw在draw信号回调中被有效地忽略了。尝试从超时运行它,在调用之间有一小段时间。我怀疑队列绘制被精确地忽略以避免错误导致意外的“动画”。draw回调应该实际进行绘图,而不是推迟到以后,所以在它中间调用gtk_queue_draw听起来像是一个不正确的实现。 -
您的代码没有问题。我使用秒表测量了在窗口上移动的点为 8.3 秒。使用 60 Hz 的刷新率,每帧移动 1 个像素的点和 500 个像素的窗口宽度计算出需要 8.3333 秒。所以,一切正常。要提高速度,您需要增加每帧移动的距离。在您的代码中,这将增加 vX 的值。