cairo context life-time limited吗?

is the cairo context life-time limited?

不幸的是我不得不问,因为文档没有很好地说明这一点。

cairo_tcairo_surface_t是否有终身限制?

在网络上找到的许多示例或示例中,几乎总是为每个重绘操作重新创建表面和上下文(更常见的是上下文)。

实际上,如果我只懒惰地创建表面和上下文一次,就像这里,当 x11 windows 调整大小时,它似乎工作得很好:

void updateWindowSize()
{
    if(!display || !_win)
        return;

    int w = cast(uint) lround(width);
    int h = cast(uint) lround(height);

    if (!_osSetSizePos)
        XResizeWindow(display, _win, w, h);
    if (!cairoSurface)
        cairoSurface = cairo_xlib_surface_create(display, _win, _visual, w, h);
    cairo_xlib_surface_set_size(cairoSurface, w, h);

    if (!_cr) _cr = cairo_create(cairoSurface);
    _cv.setContext(_cr); // _cv = canvas
}

但是每次都必须将上下文传递给 canvas _cv.setContext(_cr); 否则永远不会应用设置(颜色、笔宽...),这很疯狂,因为上下文本身永远不会改变。

这完全违背了我之前看到的内容,包括 this Q 的答案。

潜在的问题是,如果每次重绘都重新创建上下文,那么每次重绘都必须执行 cairo_set_source_rgbacairo_set_sourcecairo_set_line_width 等操作也重绘,这可以看作是性能问题。

不,生命周期不受限制(至少开罗是这样)。您可以根据需要使用两者。您甚至不需要为 window 调整大小重新创建表面,因为有 cairo_xlib_surface_set_size()。 (甚至还有 cairo_xlib_surface_set_drawable() 可以更改可绘制对象,但我个人不喜欢该功能。)

但是,像 GTK 这样的库可能会增加一些要求。例如,GTK 进行双缓冲,无法缓存上下文。