X11窗口缓冲区上是否存在许多多边形会减慢其他GUI元素的绘制速度吗?

时间:2019-06-02 21:22:30

标签: c x11 xlib

我们正在开发一个旧的X-Windows / Motif应用程序,以多边形的形式显示实时空中交通(飞行)和对流天气。该应用程序是双缓冲的,后缓冲包含地图元素和天气多边形,前缓冲显示航班信息。每隔200 ms循环,在使用飞行数据更新前缓冲区之前,将后缓冲区复制到前缓冲区。

我们发现,当多边形可见时,画布上飞行符号的绘制在时间上的变化更大。因此,应该花费几微秒的时间有时会超过100毫秒,这意味着GUI无法在200毫秒的循环中完成其任务。

我们正在通过远程桌面(X2Go)运行该应用程序,尽管进行了很多压缩,但绝对可以使问题更加明显。

我已经为实际的多边形绘制代码计时了,它只需要4到6毫秒。但是多边形的出现似乎对其他元素(飞行符号)的绘制产生了巨大影响。因此,在600个符号中,大多数占用200毫秒,而6-8个符号在200毫秒的循环中每个占用100毫秒。这将导致该应用无法使用。

下面的代码显示了如何绘制多边形(每个)以及如何绘制每个飞行符号(作为一个字符)。

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的时间会因数量级而变化吗?

1 个答案:

答案 0 :(得分:0)

根据类似应用程序的经验,您可以通过避免重复更改GC来加快应用程序的速度。而是创建许多预定义的只读GC,并将其用于绘图请求。