不幸的是我不得不问,因为文档没有详细说明。
cairo_t
和cairo_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_rgba
,cairo_set_source
,cairo_set_line_width
等操作。 ,这可以被视为一个性能问题。
答案 0 :(得分:0)
不,生命周期不受限制(至少是开罗)。您可以根据需要同时使用它们。您甚至不需要为窗口调整大小重新创建曲面,因为有cairo_xlib_surface_set_size()
。 (甚至有cairo_xlib_surface_set_drawable()
可以改变抽签,但我个人并不喜欢这个功能。)
然而,像GTK这样的库可能会增加一些要求。例如,GTK会进行双重缓冲,并且无法缓存上下文。