2015-12-25 4 views
0

К сожалению, я должен спросить, потому что документация не указывает это очень хорошо.- это ограниченный срок жизни в каире?

Есть ли 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

Вы говорите, что такие операции, как 'cairo_set_source_rgba()' и т. Д., Являются проблемой производительности. Почему ты так думаешь? Вы просто делаете это или это действительно проблема с производительностью? Зачем? Как вы знаете/измеряете? –

+0

На самом деле мое замечание о перфомансе не было уместным, так как во время одной операции рисования каждый раз, когда someting должен быть заполнен собственным шаблоном, шаблон должен быть переопределен. –

ответ

0

Нет, срок службы не ограничен (по крайней мере, cairo). Вы можете использовать их как можно дольше. Вам даже не нужно воссоздавать поверхность для изменения размеров окна, потому что есть cairo_xlib_surface_set_size(). (Там даже есть cairo_xlib_surface_set_drawable(), который может изменить доступный, но лично мне не нравится эта функция.)

Однако библиотеки, такие как GTK, могут добавить некоторые требования. Например, GTK выполняет двойную буферизацию, и контексты не могут быть кэшированы.

+0

Поверхность явно нет. Но я встречаюсь с проблемой на холсте. Если я не воссоздаю контекст. –

+0

... который? У вас есть полный, самодостаточный образец кода, который я мог бы попробовать? –

+0

Нет, но теперь проблемы, о которых я упоминал, исправлены, они были вызваны ошибочным использованием cairo_save и cairo_restore. Теперь это кристально ясно: единый контекст прекрасно работает в течение всего срока службы приложения (по крайней мере, без двойной буферизации). –

Смежные вопросы