2

我在下面写了一个drawCircle函数,但是随着更多的圆圈被绘制/重绘,内存使用量大大增加,所以我假设某处存在内存泄漏,但我似乎无法弄清楚。我尝试在函数末尾删除实例,但这没有帮助。

void drawCircle(cairo_surface_t *container, int x, int y, int radius, float r, float g, float b, float a)
{   
cairo_t *cairoInstance;                                                                                                                      
cairoInstance = cairo_create(container);                                                                                                                     

cairo_set_source_rgba(cairoInstance, r, g, b, a);
cairo_arc(cairoInstance, x, y, radius, 0, 2*M_PI);
cairo_stroke_preserve(cairoInstance);
cairo_fill_preserve(cairoInstance);

//delete cairoInstance;
gtk_widget_queue_draw_area(GTK_WIDGET(frame2), 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);   
}

有任何想法吗?提前致谢。

4

1 回答 1

3

几点:

  • cairo_ts 是引用计数的。当cairo_destroy你完成你的cairo_t*. 或者,您不需要cairo_t为每个圆圈创建和销毁 's - 通过拉出对cairo_create.
  • 除非你需要它们,否则更喜欢这些cairo_X功能cairo_X_preserve。在您的代码cairo_fill_preserve中可能应该是cairo_preserve. (但应该保留笔画,以便以下填充起作用。)
  • gtk_widget_queue_draw_area也可以重构使您的 gtk 小部件的矩形无效的调用,并且每次绘制只执行一次。
  • gtk_widget_queue_draw_area使小部件窗口的矩形区域无效-您可能会很好gdk_window_invalidate_rect-请参阅文档

重构后的伪代码(使用假设的 Circle 类型):

void drawCircle(cairo_t *cr, int x, int y, int radius, float r, float g, float b, float a) {   
    cairo_set_source_rgba(cr, r, g, b, a);
    cairo_arc(cr, x, y, radius, 0, 2*M_PI);
    cairo_stroke_preserve(cr); // keep the arc so that we can call cairo_fill
    cairo_fill(cr);
}

void functionThatDrawsCircles(cairo_surface_t* surface, Circle* circles, int num) {
    cairo_t* cr = cairo_create(surface);
    for(int i = 0; i < num; i++) {
        drawCircle(cr, circles[i].x, circles[i].y, 10, circles[i].r, circles[i].g, circles[i].b, 1.0);
    }
    cairo_destroy(cr);
    gtk_widget_queue_draw_area(GTK_WIDGET(frame2), 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);   
}
于 2013-05-29T20:44:54.207 回答