我们正在开发一个遗留的X-Windows/Motif应用程序,以多边形的形式显示实时空中交通(航班)和对流天气。该应用程序是双缓冲的,后台缓冲区包含地图元素和天气多边形,前台缓冲区显示航班信息。每200毫秒循环,在用飞行数据更新前台缓冲器之前,后台缓冲器被复制到前台缓冲器。
我们发现,当多边形可见时,画布上飞行符号的绘制在时间上的变化要大得多。因此,应该花费微秒的时间有时会超过100毫秒,这意味着GUI无法在200毫秒的循环中完成其任务。
我们在远程桌面(X2Go)上运行应用程序,尽管存在大量压缩,但这无疑使问题变得更加明显。
我对实际的多边形绘制代码进行了计时,它只需要4-6毫秒。但是多边形的存在似乎对其他元素的绘制产生了巨大的影响,比如飞行符号。因此,在600个符号中,大多数需要几个微秒,而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的时间可能会因数量级而变化,这是可以预期的吗?
发布于 2019-11-03 21:34:16
根据使用类似应用程序的经验,您可以通过避免对GC的重复更改来加速应用程序。相反,可以创建许多预定义的只读GC,并将它们用于绘图请求。
https://stackoverflow.com/questions/56419035
复制相似问题