我们正在使用旧版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的时间会因数量级而变化吗?
根据类似应用程序的经验,您可以避免重复更改GC来加快应用程序的速度。而是创建许多预定义的只读GC,并将其用于绘图请求。