开罗背景的生命周期有限吗?

时间:2015-12-25 13:25:16

标签: x11 cairo

不幸的是我不得不问,因为文档没有详细说明。

cairo_tcairo_surface_t有效期是否有限?

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

实际上,如果我只调整表面和上下文一次,就像这里一样,在调整x11窗口的大小时,它似乎工作得非常精细:

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
}

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

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

根本问题是,如果为每次重绘重新创建上下文,那么每次重绘都必须执行诸如cairo_set_source_rgbacairo_set_sourcecairo_set_line_width等操作。 ,这可以被视为一个性能问题。

1 个答案:

答案 0 :(得分:0)

不,生命周期不受限制(至少是开罗)。您可以根据需要同时使用它们。您甚至不需要为窗口调整大小重新创建曲面,因为有cairo_xlib_surface_set_size()。 (甚至有cairo_xlib_surface_set_drawable()可以改变抽签,但我个人并不喜欢这个功能。)

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