我正在将 OpenGL 应用程序移植到 Linux(Debian Jesse 核心,使用 GLX、X11 和 Xfree86,通过 Mesa 10.3.2 使用 GL 3.0)。我陷入了一个我不完全理解的渲染问题(描述如下),并且我已经用尽了我知道如何使用的调试方法。我的问题是,我该如何调试呢?是否有我可以用来检查性能的工具、我可以查看的日志文件、我可以安装和设置断点的开发库等等?
症状:
- 实例化窗口后,将绘制窗口框架但未绘制窗口内容(我在窗口中看到桌面背景)
- 在标题栏上单击拖动以移动窗口是缓慢的
- 关闭应用程序需要几秒钟,但在窗口被销毁之前的很短的瞬间,正确的屏幕输出出现在窗口中
- 将窗口调整为非常小不会改善缓慢或显示问题
top
显示最大 cpu 使用率仅为 2%(大部分时间在 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 st KiB Mem:总共 16411604 个,已使用 1342704 个,可用 15068900 个,47860 个缓冲区 KiB 交换:总共 2783228 个,使用 0 个,免费 2783228 个。752736 缓存内存 PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 3758 安德鲁 20 0 145700 25080 16704 R 0.3 0.2 0:02.36 mtexec
我试过的:
- 我在 Windows 上遇到了类似的问题,问题是将空窗口句柄传递给
SwapBuffers
调用。我在通话gdb
中设置了断点,glXSwapBuffers
并确保现在没有发生同样的事情。 gdb
使用确保Display*
和Window
实例不为空且未更改来跟踪窗口创建代码。- 重绘和不重绘
Expose
和ConfigureNotify
事件。删除重绘代码似乎对问题没有任何影响。 - 万一这很重要,我正在使用 GLEW,但不是用于创建上下文。我得到一个指向
glXCreateContextAttribsARB
via的函数指针glXGetProcAddress
。