2016-07-23 39 views
0

我移植的OpenGL应用程序到Linux(Debian的杰西核心,通过梅萨10.3.2使用GLX,X11和XFree86,GL 3.0)。我被困在一个渲染问题上,我不完全理解(下面的描述),并且我已经用尽了我知道如何使用的调试方法。我的问题是,我如何处理调试呢?有没有我可以用来检查性能的工具,我可以查看的日志文件,我可以安装和设置断点的开发库,还有其他的东西?调试GLX应用程序 - 呆滞窗口不重绘

症状:

  • 一旦窗口被实例化,窗框绘制,但窗口的内容中没有画出(我看到在窗口的桌面背景)
  • 标题栏上单击并拖动移动窗口缓慢
  • 关闭应用程序需要几秒钟,但在窗口被破坏之前的一瞬间,正确的屏幕输出出现在窗口中
  • 调整窗口的大小非常小改善污泥ggishness或显示问题
  • 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通话。我在我的glXSwapBuffers调用中运行了gdb并确定了断点,并确保现在不会发生同样的情况。
  • 通过使用gdb确保该Display*Window情况下不为空,而不是被改变的窗口创建代码跟踪。
  • 重绘和ExposeConfigureNotify事件未重绘。删除重绘代码似乎对问题没有任何影响。
  • 万一它很重要,我使用GLEW,但不适用于上下文创建。我得到一个函数指针glXCreateContextAttribsARB通过glXGetProcAddress
+0

应用程序的内存使用量在运行时是否增长? – SurvivalMachine

+0

我现在正在观看它,记忆以非常低的增量上升和下降,而且似乎不会长时间增长。 –

+0

我在这个问题上取得了一些进展。我删除了我用来枚举视频模式的XFree86代码,现在我得到了屏幕输出。我也相信另一个问题是潜伏在我的旧代码中,一个X11'Window'对象的浅拷贝导致了一些问题。作为参考,这个例子正在为我工​​作:https://www.opengl.org/discussion_boards/showthread。php/165856-Minimal-GLX-OpenGL3-0-example –

回答

1

关于如何调试此问题的问题的简短答案:检查您的显示器枚举是否提供了一个实际上与您的X11显示器兼容的GLXFramebufferConfig。如果混合glXXf86库调用,尽量只使用glX让程序运行起来。详细解释细节的一个很好的资源是Programming OpenGL in Linux: GLX and Xlib指南。