调试 GLX 应用 - 缓慢的窗口不会重新绘制



我正在将OpenGL应用程序移植到Linux(Debian Jesse core,使用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个用户,平均负载:0.31,0.12,0.12任务:共1个,1个正在运行,0个正在睡眠,0个已停止,0个僵尸%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 stKiB Mem:总计16411604,使用1342704,空闲15068900,缓冲47860KiB交换:总共2783228,使用了0,免费2783228。752736缓存内存PID用户PR NI VIRT RES SHR S%CPU%MEM TIME+命令3758 andrew 20 0 145700 25080 16704 R 0.3 0.2 0:02.36 mtexec

我尝试过的:

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

我关于如何调试这个问题的问题的简短答案是:检查您的显示器枚举是否提供了一个实际上与X11显示器兼容的GLXFramebufferConfig。如果您将glXXf86库调用混合使用,请尝试仅使用glX来启动并运行程序。一个很好的解释细节的资源是在Linux中编程OpenGL:GLX和Xlib指南。

最新更新