【问题标题】:Constantly lag in opengl application在opengl应用程序中不断滞后
【发布时间】:2012-04-18 02:41:01
【问题描述】:

我在我的 opengl 应用程序中遇到了一些重复的滞后。 我正在使用 win32 api 创建窗口,并且还在创建 2.2 上下文。 所以程序的主循环很简单:

  • 清除颜色缓冲区
  • 画一个三角形
  • 交换缓冲区。

三角形正在旋转,这就是我可以看到滞后的方式。 我的帧时间也不流畅,这可能是问题所在。 但我非常确定增量时间计算是正确的,因为我尝试了很多方法。

您认为这可能是图形驱动程序的问题吗? 因为我的一个朋友运行几乎完全相同的程序,除了我做的计算更少+我使用的是标准的 opengl 着色器。 此外,他的程序比我的程序使用更多的 CPU 功率,并且 CPU 百分比比我的更平滑。

我还应该补充: 在我的笔记本电脑上,我每隔约 1 秒就会有相同的延迟,所以我可以看到某种模式。

【问题讨论】:

  • 你的代码中有睡眠语句吗?尝试增加 sleep 语句的持续时间,并增加每次迭代的轮换量。

标签: c++ winapi opengl lag


【解决方案1】:

帧速率抖动的原因有很多。在我脑海中浮现:

  • 不在每一帧结束时调用 glFlush()
  • 其他运行软件干扰
  • 在代码中做某些图形驱动程序不喜欢的事情
  • 图形驱动程序中的错误
  • 使用标准的 windows 时间函数,分辨率极差

试试这些:

  • 尽可能多地杀死正在运行的程序。为此,请使用任务管理器中的进程选项卡 (CTRL-SHIFT-ESC)。
  • 一点一点地减少程序正在执行的工作量,看看它如何影响帧速率和显示的平滑度。
  • 如果可以,请尝试启用/禁用垂直同步(您可以在显卡设置中执行此操作)看看是否有帮助
  • 添加一些调试代码以输出绘制每一帧所用的时间,并查看数字中是否存在异常,例如每 20 帧需要额外的 20 毫秒,或者随机帧需要 100 毫秒。

【讨论】:

  • 不要忘记,在硬件渲染的情况下,在主循环轮询输入和等待新帧时会占用所有 CPU 时间。图形驱动程序也需要 CPU。
  • glFlush 由 SwapBuffers 隐含,无需在双缓冲上下文中调用它。
  • 谢谢。我现在以 ms 为单位打印帧时间,但只是在 ms > 10.0f 时。我得到了一些有趣的结果。当我的旋转三角形故障滞后时,毫秒约为 17-32(通常为 ~30)。流畅运行时的帧时间约为 3 毫秒,我还没有测试过两次延迟之间需要多长时间,但是您知道问题可能是什么吗?
  • 就像我说的,它可以是任何东西。你的笔记本电脑上可能有另一个程序在干扰,或者它可能是驱动程序中的一个错误,或者它可能只是你的程序。正如我建议的那样,尝试更改您的程序,并终止其他正在运行的进程,看看这如何影响帧绘制时间。
  • 监视器的行为并非如此。这听起来很像显卡驱动程序问题,可能会被您机器上当前运行的任何东西激怒。
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多