调试GLX应用程序 - 缓慢的窗口不重绘

时间:2016-07-23 04:55:24

标签: debian x11 glx

我正在将一个OpenGL应用程序移植到Linux(Debian Jesse核心,使用GLX,X11和Xfree86,GL 3.0通过Mesa 10.3.2)。我遇到了一个我不完全理解的渲染问题(描述如下),我已经用尽了调试的方法,我知道如何使用。我的问题是,我该如何调试呢?有没有我可以用来检查性能的工具,我可以查看的日志文件,我可以安装的开发库和设置断点,还有什么?

症状:

  • 实例化窗口后,绘制窗口框架但不绘制窗口内容(我在窗口中看到桌面背景)
  • 点击并拖动标题栏以移动窗口是缓慢的
  • 关闭应用程序需要几秒钟,但是在窗口被销毁之前的一个非常短暂的瞬间,窗口中会显示正确的屏幕输出
  • 将窗口调整为非常小并不会改善迟缓或显示问题
  • top显示最大使用率仅为2%cpu(大部分时间范围在0.3 - 0.7%之间),内存使用量上升和下降但保持稳定范围,其余的图形应用程序遭遇一点滞后,但系统的其余部分相当活泼。这是来自top的快照:
top - 01:09:42 up  3:43,  3 users,  load average: 0.31, 0.12, 0.12
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.4 sy,  0.0 ni, 99.2 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  16411604 total,  1342704 used, 15068900 free,    47860 buffers
KiB Swap:  2783228 total,        0 used,  2783228 free.   752736 cached Mem
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                      
3758 andrew    20   0  145700  25080  16704 R   0.3  0.2   0:02.36 mtexec

我尝试了什么:

  • 我在Windows上遇到了类似的问题,问题是将一个空窗口句柄传递给SwapBuffers调用。我在gdb电话上使用断点运行了glXSwapBuffers,并确保现在没有发生同样的事情。
  • 使用gdb跟踪窗口创建代码,确保Display*Window实例不为空且未更改。
  • 重新绘制而不是重绘ExposeConfigureNotify个事件。删除重绘代码似乎对此问题没有任何影响。
  • 如果重要,我使用的是GLEW,但不是用于创建上下文。我通过glXCreateContextAttribsARB得到了一个指向glXGetProcAddress的函数指针。

1 个答案:

答案 0 :(得分:1)

关于如何调试此问题的问题的简短回答:检查您的显示枚举是否提供了与您的X11显示实际兼容的GLXFramebufferConfig。如果您要将glXXf86库调用混合使用,请尝试使用glX启动并运行该程序。解释详细信息的好资源是Programming OpenGL in Linux: GLX and Xlib指南。