【问题标题】:Tips to reduce opengl 3 & 4 frame-rate stuttering under LinuxLinux 下减少 opengl 3 & 4 帧率卡顿的技巧
【发布时间】:2011-09-09 09:05:20
【问题描述】:

近年来,我为 OpenLG 2 和 ES 开发了几个小游戏和应用程序。 我现在正在尝试为桌面系统上的休闲“3D”图形构建一个基于 opengl 3+ 的场景图。 (没有比想象中的虚幻引擎或 crytec 引擎更复杂的了。)

我从 OsX 10.7 开始我的开发,苹果最近发布的 ogl 3.2 版本给我留下了深刻的印象,它与 Windows 系统相比取得了相当的结果。

否则,Linux 的结果令人失望。即使是最基础的动画也会卡顿,破坏现实的印象。 Windows 工具包 freeglut 和 glfw 的结果没有差异。 (扩展加载了 glew 1.7)

我想提一下,我说的是新的 opengl 核心,而不是旧的 opengl 2 渲染路径,它在 Linux 下运行良好,但使用 cpu 而不是 gpu 进行复杂的操作。

在观看了诸如“Unigine Heaven 演示”之类的专业演示之后,我认为在 Linux 中使用现代实时 3D 图形存在一个普遍的问题。

非常欢迎任何解决此问题的建议。

更新

我正在使用: AMD Phenom II X6、Radeon HD57XX 以及最新的专有驱动程序 (11.8) 和 Unity(64Bit)。

您可以从工具包文档中获取我的渲染循环:

do {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ...
} while (!glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED));

我正在使用 VBO,所有的转换阶段都使用着色器完成。动画计时由 glfwGetTime() 完成。在窗口和全屏模式下会出现此问题。我不知道合成管理器是否会干扰全屏应用程序。但也不可能要求用户禁用它。

更新 2

错字:我使用的是 HD57XX 卡。

GLX_Extension:http://snipt.org/xnKg

PCI 转储:01:00.0 VGA compatible controller: ATI Technologies Inc Juniper [Radeon HD 5700 Series]

X 信息:http://pastie.org/2507935

更新 3:

禁用合成管理器会减少,但并没有完全消除口吃。 (我用“ubuntu classic without extensions”替换了标准窗口管理器) 每隔一秒,动画就会冻结并出现丑陋的扭曲:

(图片已删除 - 不允许发布图片。)

尽管在驱动程序中启用了垂直同步并在应用程序中进行了检查。

【问题讨论】:

  • 您并没有真正告诉我们您正在做什么或一般问题。您说您的 GL 2 路径使用 CPU 进行“复杂操作”,并且您暗示您的 GL 3 路径使用 GPU。好的,但是这些“复杂操作”是什么?你在渲染什么?您的 GL 2 渲染路径是什么样的,它与您的 GL 3 渲染路径有何不同?
  • GL2和GL3核心有很大的不同。 GL3 将许多用于转换、映射和动画的操作移至着色器(顶点、几何和片段着色器)。用 GLSL 编写的着色器在 GPU 上执行。
  • 我很清楚 GL 2 和 GL 3 之间的区别。但这并不能回答我的问题。它没有告诉我们两条渲染路径是什么样的。它可以是任何东西,从将顶点数据传输到着色器逻辑的方式,到将制服设置为其他任何东西的方式。如果不知道您实际在做什么,您的问题根本无法被诊断出来。此外,您似乎错误地认为 GL 2 意味着“不能使用着色器”。您可以在 GL 2 中很好地使用着色器; GL 3 核心只是使其强制
  • 尼可波拉斯所说的。如果您可以发布 'glxinfo'、'xdpyinfo'、'/usr/sbin/lspci' 和 'ps awx' 的输出,这将是一个很大的帮助,以便我们查看您的机器上正在运行的内容。
  • 抱歉,系统暂时无法访问。我的 Linux 开发机器是 AMD Phenom II X6、Radeon HD54XX、Ubuntu 11.4 (Natty),带有最新的专有驱动程序 (11.8) 和 Unity 作为桌面。

标签: linux opengl


【解决方案1】:

由于您运行的是 Linux,我们需要一些详细信息:

  • 您使用哪种硬件?

    目前只有 NVidia、AMD/ATI 和 Intel 提供 3D 加速。

  • 哪些驱动程序?

    对于 NVidia 和 AMD/ATI,有专有(nvidia-glx、fglrx)和开源驱动程序(nouveau、radeon)。对于 Intel,只有开源驱动程序。

    • 在所有开源 3D 驱动程序中,英特尔驱动程序的质量最好。
    • 开源 AMD/ATI 驱动程序“radeon”已达到可接受的状态,但在性能方面仍达不到标准。
    • 对于 NVidia GPU,唯一可以有效使用的驱动程序是专有驱动程序。开源的“nouveau”驱动程序还没有做到这一点。
  • 您是否运行合成窗口管理器?

    合成会产生一大堆同步和时间问题。此外,您可以在某些地方的合成 WM 中找到(某些)OpenGL 代码,这让经验丰富的 OpenGL 编码员热泪盈眶,尤其是如果您有编写实时 3D(游戏)引擎的经验的话。

    KDE4 和 GNOME3 默认使用合成(如果可用)。 Ubuntu Unity 桌面外壳也是如此。此外,对于一些非合成 WM,默认的脚本启动 xcompmgr 以获得透明度和阴影效果。

  • 最后但同样重要的是:您是如何实现渲染循环的?

    经常发现的一个错误是,使用计时器以“定期”间隔发出重新显示事件。这不是正确完成的方式。定时器事件可以任意延迟,标准定时器本身也不是很准确。

    正确的方法是在一个紧密的循环中调用 display 函数并测量渲染迭代之间的时间,然后使用这个时间来相应地推进动画。一种真正优雅的方法是使用其中一个 VSync 扩展,它提供一个显示刷新频率和刷新计数器。这样一来,您就不会使用计时器,而是会准确地告诉您显示刷新周期中帧之间的时间提前。

【讨论】:

  • 我更新了我的问题。我还尝试使用 VSync(我从古老的 C64 时代就知道这个技巧。)。这适用于 OsX 和 Windows(至少使用最新的驱动程序),但在 Linux 上失败。
  • 不幸的是,整个合成完全搞砸了 VSync。从技术上讲,修复起来相当简单,但每当我试图解释 X.org 开发人员时,我都会得到空白的凝视(以电子邮件形式);而且我自己无法修复它,因为它需要修补驱动程序。有两件事要做:如果窗口被重定向(到屏幕外缓冲区)双缓冲关闭(合成是双缓冲),定向 Windows (v)sync 截止日期,由合成器设置,取决于估计的时间用于绘制构图。
  • 对于测试,我在单缓冲应用程序上使用 XDamage 扩展和 XSync 模拟了这一点。工作得很好。窗口管理器/合成器也可以做一些简单的事情,比如如果最上面的窗口没有 Alpha 通道,则将其排除在合成之外。
  • 谢谢。你刚刚回答了另一个问题。我可以帮助说服 X.org 开发人员修复这个错误吗?韦兰是替代品吗?我认为第一个版本计划在明年发布?
  • X.org 的 VSync 不好并不是一个错误,而是缺少一些功能。我看到的最大问题是,一些(不是全部)知名的 X.org 开发人员缺乏对采样理论的基本了解,最值得注意的是 Nyquist 定理以及他们解决问题的许多(徒劳无功)尝试由此产生。他们知道如何有效地处理数据,但是一旦涉及到信号处理理论,事情就会变得很糟糕。不幸的是,信号同步就是信号处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多