gpt4 book ai didi

c - GTK3 和 cairo 太慢

转载 作者:行者123 更新时间:2023-11-30 14:50:52 28 4
gpt4 key购买 nike

我用 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 注册您的新函数 redraw 每 0.05 秒(例如每 50 毫秒)调用一次,并且 redraw 不仅应该绘制东西,而且还返回 TRUE 以在 50 毫秒后重新启动。你会发现这样的 50 毫秒延迟可能太小了,你肯定想增加它。

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

您的程序中没有动画代码(因为任何动画都应该定期运行)。 event loop(在gtk_main中)仅在需要时被调用。您可能只想部分重新绘制窗口。

你的做法是错误的。您不想使用 gtk_widget_queue_draw 重复绘图,您希望它定期再次发生(例如,从新的 redraw 例程调用 gtk_widget_queue_draw使用 g_timeout_add 注册)。您将通过实验调整该周期。

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

研究一些 GTK examples 的源代码(特别是 clock 示例)。另请参见 thisthat 。查看 custom drawing 示例,并查看 aclock 的源代码。

(你的程序并不太慢,但是你的draw调用可能不够频繁;没有代码可以重复它;你应该use the gdb debugger并用编译你的代码-Wall -g 传递给 gcc - 另外还有 pkg-config 提供的其他标志)

关于c - GTK3 和 cairo 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725156/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com