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への呼び出しを引き出して関数をリファクタリングしますcairo_create
  • 必要でない限り、機能よりもcairo_X機能を優先してくださいcairo_X_preserve。あなたのコードcairo_fill_preserveではおそらくcairo_preserve. (ただし、次の塗りつぶしが機能するように、ストロークは保持する必要があります。)
  • gtk ウィジェットの四角形を無効にする呼び出しgtk_widget_queue_draw_areaもリファクタリングでき、描画ごとに 1 回だけ実行できます。
  • 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 に答える