繁体   English   中英

GTK3和开罗太慢

[英]GTK3 and cairo too slow

我使用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();
}

您应该使用计时器 ,例如g_timeout_add 您可以向g_timeout_add注册,每0.05秒(例如,每50毫秒)调用一次新函数redraw ,该redraw不仅应绘制g_timeout_add ,还应返回TRUE以便在50毫秒后重新启动。 您会发现这样的50毫秒延迟可能太小了,您肯定想增加它。

(请注意,在Intel i5-4690S的Linux / Debian / Sid / x86-64上,您的程序仅占用3%的CPU时间,以time(1) ...为单位,因此它并不太慢;计算机花费97等待的时间百分比!还请记住,人眼大部分时间看不到比30到60 Hz快得多的速度)

您的程序中没有动画代码 (因为应定期运行任何动画)。 仅在需要时才调用事件循环 (在gtk_main )。 您可能只希望部分重画窗口。

您的方法是错误的。 您不想使用gtk_widget_queue_draw重复绘图,而是希望它定期定期发生(例如,从注册了g_timeout_add的新redraw例程中调用gtk_widget_queue_draw )。 您将通过实验调整该时间段。

您还可以使用gtk_widget_add_tick_callback (如c-smile所述)。 我认为您不需要它(因为我猜您的动画然后可能运行得太快)。

研究一些GTK示例 (尤其是时钟示例)的源代码。 又见这个那个 查看自定义工程图示例和aclock的来源。

(您的程序并不太慢,但是您的draw可能调用的频率不够高;没有代码可以重复执行;您应该使用gdb调试器,使用传递给gcc -Wall -g编译代码-除其他标志外由pkg-config

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM