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