我正在开发一种音频应用程序,需要在其中显示一些图表。想一想:高帧率下的实时波形图像。
我只需要显示一些高帧速率的图形缓冲区。最好大于60fps,无需花费太多时间。我现在实施的方式太慢了。我只能得到分辨率为800x800像素的10fps。画图不是问题,Xorg一直在画。
我现在使用的方法是创建一个cairo_image_surface,然后在需要更改的像素处操作cairo_images_surface中的数据(非常快)
因为我正在编程一个类似示波器的东西,我不需要一直重画所有像素。所以画东西不是很慢。
我认为最慢的部分是我需要调用cairo_set_source_surface()来实际显示一些内容。
代码中最重要部分的摘要。on_plot_event在每次有新的音频样本可供显示时调用。

static gboolean on_plot_event(GtkWidget *widget,cairo_t *cr,gpointer user_data){
    cairo_set_source_surface(cr,crsurfplot,0,0);
    cairo_paint(cr);
    return FALSE;
}

int doplot(jack_default_audio_sample_t *in,jack_nframes_t nframes){
    cairo_surface_flush(crsurfplot);
    char *p;
    unsigned char *pixstart;
    pixstart = plotdata;
 //drawing stuff, manipulate pixels at pixstart
    cairo_surface_mark_dirty(crsurfplot);
    if(drawcount%10 ==0){
    gdk_threads_enter();
    gtk_widget_queue_draw(window);
    gdk_threads_leave();
    }
}


int main(int argc,char *argv[]){
    gdk_threads_init();
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    plotstride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24,plotwidth);
    plotdata = malloc (16000000);
    crsurfplot = cairo_image_surface_create_for_data    (plotdata,CAIRO_FORMAT_RGB24,plotwidth,plotheight,plotstride);
    plotdata = cairo_image_surface_get_data(crsurfplot);

    plot = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(window),plot);

    g_signal_connect(G_OBJECT(plot),"draw",G_CALLBACK(on_plot_event),NULL);
    g_signal_connect(G_OBJECT(plot),"configure-event",G_CALLBACK(on_confev),NULL);

    gtk_widget_show_all (window);
    gtk_widget_show (window2);
    printf("test\n");

    crplot=gdk_cairo_create(gtk_widget_get_window(plot));
    cairo_set_source_surface(crplot,crsurfplot,0,0);

    gtk_main ();

    jack_client_close(client);
    return 0;

}

在开罗创造我想要的东西是不可能的吗?我应该改用openGL或者类似的东西吗?或者我只是做错了什么?
编辑:添加链接到我的丑陋的程序到目前为止。
http://ubuntuone.com/4dphKneXOgQPTR8fZydKpo

最佳答案

我现在使用的方法是创建一个cairo_images_曲面,然后在需要更改的像素处操作cairo_images_曲面中的数据(非常快)
因为我正在编程一个类似示波器的东西,我不需要一直重画所有像素。所以画东西不是很慢。
我不同意我遇到的99.9%的图形应用程序(更大的显示和帧速率)在后台用所有复杂的精灵、条形图等重绘图片比一次全部翻转要快。尽管这听起来有违直觉,我建议你还是试试这个
开罗应该能满足你的要求。

08-03 21:41