2009-11-25 19 views
2

我已经用C++编写了3D立体OpenGL程序。我跟踪显示器中的位置对象应该在timeBeginPeriod(1)之后使用timeGetTime。当我使用“开始调试”运行程序时,我的对象在显示器上平滑移动(因为它们应该)。当我通过“无需调试就开始”运行程序时,对象会暂时冻结几次屏幕刷新,然后跳转到新的位置。任何想法可能会导致这个问题,以及如何解决它?什么可能导致OpenGL在“开始调试”与“无需开始调试”选项下表现不同?

编辑:当我点击鼠标按钮时,如果运行“无需调试即可开始”运行,似乎可以在很短的延迟后解决这个问题。我的应用程序是一个控制台应用程序(当程序第一次启动时,我接受了一些参数)。这两个选项之间的窗口焦点可能有区别吗?有没有一种明确的方法来强制焦点到OpenGL窗口(通过glutFullScreen();全屏幕)当我完成从控制台窗口输入?

谢谢。

+0

您的发布版本的性能如何?您的整体CPU使用率如何? – 2009-11-25 19:51:04

+0

因为我几乎完全在开发环境中工作,并且CPU使用率不应该成为我渲染的简单显示器的问题,所以我从来没有构建过发布版本。我最近尝试这样做是因为我一直使用的屏幕截图库阻止了正确链接。运行该过程的核心CPU利用率很高,但很少与其挂钩。 – russellpierce 2009-12-18 20:26:28

回答

0

导致任何程序在被调试但未被调试时行为不同的最常见事情是使用未初始化的变量,尤其是读取未初始化的内存。检查你没有这样做。

更多特定于OpenGL - 您可能在刷新命令时遇到一些问题。尝试在绘制每一帧后插入glFinish()
以某种方式确保当冻结发生时实际上正在渲染帧而不是整个应用程序被冻结也可能有所帮助。因为看起来OpenGL完成了它的工作,所以如果它更可能在逻辑中存在一些错误。

+0

谢谢你的建议。任何有关如何确定帧在明显冻结期间是否仍在渲染的建议?之前我曾试图检查过,但发现由于编写文件而导致的减速掩盖了所发生的任何事情。由于这是一个120赫兹的立体声显示屏,我可以通过整个显示器循环约8.33毫秒。 – russellpierce 2009-11-25 19:26:23

+0

通常,调试版本将以完全相同的方式初始化内存,无论是否运行调试器。在Windows上,您仍将使用调试运行时库。移植到发布版本时,它可以产生很大的不同。 – 2009-11-25 19:40:56

1

timeGetTime API仅具有10ms之类的精度。如果您正在测量的时间间隔小于50毫秒左右,则可能只是看到系统计时器中预期变化的影响。我不知道调试器为什么会对此产生影响,但是系统的整个运行都是黑盒子。您可以使用QueryPerformanceCounter获得更高分辨率的时序,这可能有所帮助。

+0

谢谢,我会看看那个。我曾认为timeBeginPeriod(1)准确地将分辨率设置为1ms。如果分辨率为@ 10毫秒,可能会给我的代码带来一些问题。 – russellpierce 2009-11-25 19:30:19

+0

@drknexus timeGetTime和timeBeginPeriod的文档意味着它是1ms,但它似乎高度依赖于可用的硬件。我认为“现代”硬件可能已经解决了这个问题,我已经玩了几年了。这是我记得10ms的值的地方,但它也有几年历史了:http://support.microsoft.com/kb/172338 – 2009-11-25 20:28:23