嗨,来自Stackoverflow的人,我对编程有一些了解,但不是很多。我的想法是在c中编写类似于视频游戏或可视化器的东西,为此我制作并处理一个代表图像的数组,它必须可视化并且总是被刷新,就像视频游戏一样。我已经完成了算法,我需要优化它,我的意思是我知道如何在任何时候创建表示图像的数组,我现在需要的是将其可视化为动画,然后使用opencl进行优化。
我想做的程序必须做这样的事情:
“创造形象”
“渲染它”,
“创造形象”
“渲染它”,
...
出于这个原因,我知道我可以从一个非常简单的例子轻松开始,我不必学习GTK的所有内容。我一直在寻找简单的例子并试图理解它是如何工作的,但它没有帮助,我只需要做那个简单的动作,刷新它。某处的命令应该足够了。
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <glib.h>
const int Width = 1200, Height = 800;
char *buffer;
int i = 0;
GdkPixbuf *pixbuf;
GtkWidget *window;
GtkWidget* image;
void delay(int number_of_seconds){
int milli_seconds = 1000 * number_of_seconds;
clock_t start_time = clock();
while (clock() < start_time + milli_seconds);
}
int main (int argc, char *argv[]){
buffer = (char*)malloc(3 * Width * Height);
// CREATE AN IMAGE IN BUFFER SOMEHOW
// buffer = something;
//
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, FALSE, 8, Width, Height, (Width)*3, NULL, NULL);
image = gtk_image_new_from_pixbuf (pixbuf);
gtk_container_add(GTK_CONTAINER (window), image);
gtk_window_set_title (GTK_WINDOW (window), "Visualizador");
gtk_widget_show_all (window);
delay(0.04);
gtk_main ();
free (buffer);
return 0;
}
程序非常简单,当我在那里创建/加载图像时它会显示一张图片,但是我想把已编程的函数放在那里,返回一个“缓冲区”,然后刷新显示的图像。
我读到gtk_widget_queue_draw
有事可做,或gdk_pixbuf_simple_anim_add_frame
或g_timeout_add
,但我不知道它们是如何工作的,以及在此计划中应该放什么。
提前谢谢!
答案 0 :(得分:1)
如果你想要一个动态图像或需要刷新的东西,那么我建议使用GtkDrawingArea并实现它的绘制信号,因为你需要使用cairo。看起来应该是这样的:
static gboolean
your_draw_cb(GtkWidget *widget, cairo_t *context, gpointer data)
{
// Do your drawing
return FALSE;
}
int main()
{
// Some code before ...
GtkWidget *area = gtk_drawing_area_new();
g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(your_draw_cb), your_data);
gtk_container_add(GTK_CONTAINER(your_container), area);
// More code ...
}
每次要刷新时,都应该调用
gtk_widget_queue_draw(area);
获取调用的绘制信号。
您不需要存储缓冲区,因为它来自cairo上下文。
但您可能希望将其他库用于此目的,例如SDL2或OpenGL,因为它们是为视频游戏而设计的。
我希望这会有所帮助。