Замедляет ли присутствие многих полигонов в буфере окна X11 рисование других элементов графического интерфейса? - PullRequest
0 голосов
/ 03 июня 2019

Мы работаем над унаследованным приложением X-Windows / Motif для отображения воздушного движения (полетов) в реальном времени и конвективной погоды в виде многоугольников.Приложение с двойной буферизацией, с задним буфером, содержащим элементы карты и многоугольники погоды, и передним буфером, показывающим информацию о полете.В каждом цикле 200 мс задний буфер копируется в передний буфер перед обновлением переднего буфера полетными данными.

Мы обнаруживаем, что рисование символов полета на холсте намного более изменчиво во времени, когда многоугольники видны.То, что должно занять микросек, иногда занимает более 100 мс, что означает, что графический интерфейс не может выполнить свои задачи в цикле 200 мс.

Мы запускаем приложение через удаленный рабочий стол (X2Go), который, несмотря на множествосжатия, безусловно, делает проблему более очевидной.

Я рассчитал фактический код рисования многоугольника, и это занимает всего 4-6 мс.Но присутствие полигонов, кажется, оказывает огромное влияние на рисование ДРУГИХ элементов, символов полета.Таким образом, из 600 символов большинство занимает несколько микросекунд, а 6-8 - по 100 мс каждый в цикле по 200 мс.Это приводит к тому, что приложение становится непригодным для использования.

Приведенный ниже код показывает, как нарисованы многоугольники (каждый) и как нарисован каждый символ полета.

void
draw_lines(draw_window win_ptr, color color_ptr,
    XPoint *const points, const int npoints, const int thickness)
{
    x_draw_window  *draw = (x_draw_window *) win_ptr;
    GC color = (GC) color_ptr;

    if (thickness > 0)
    {
        XSetLineAttributes(draw->display, color, thickness, LineSolid,
            CapNotLast, JoinRound);
    }
    else
    {
        XSetLineAttributes(draw->display, color, 1, LineSolid,
             CapNotLast, JoinRound);
    }
    XDrawLines(draw->display, draw->window, color, points, npoints,
        CoordModeOrigin);
    return;
 }

void
draw_text(draw_window win_ptr, color color_ptr,
    char *font, int x, int y, char *text)
{
    x_draw_window  *draw;
    GC color;
    XTextItem t_item;
    unsigned long valuemask;
    XGCValues values;

    draw = (x_draw_window *) win_ptr;
    color   = (GC) color_ptr;

    t_item.chars = text;
    t_item.nchars = strlen(text);
    t_item.delta = 0;
    t_item.font = None;

    valuemask = GCFont;
    values.font = (Font)font;
    XChangeGC(draw->display, color, valuemask, &values);

    if (text != NULL && strcmp(text, "\0"))
    {
        XDrawText(draw->display, draw->window, color, x, y, &t_item, 1);
    }
}

Мой вопросдля любого, кто знает внутреннюю часть Xlib ... можно ли ожидать, что время завершения XDrawText может варьироваться на порядки, если в одном буфере где-то еще находятся сотни полигонов?

...