【问题标题】:SFML Drawing OpenGL to multiple windows extremely slowSFML 将 OpenGL 绘制到多个窗口非常慢
【发布时间】:2013-02-06 19:13:36
【问题描述】:

情况如下:

我有 4 个 SFML 窗口,它们位于我构建的容器内。容器为每个窗口调用独立的重绘方法,从第一个窗口开始,到最后一个窗口结束。

如果每个窗口的绘图代码都包含drawMyCube()glClear(...)这行,那么帧率就会变慢。

drawMyCube() 只是绘制一个立方体,它根据 sf::Clock 对象的值旋转。

如果一个窗口调用(其中任何一个)这些函数,则帧速率约为 60fps。 如果两个窗口调用(其中任何一个)这些函数,则帧速率约为 30fps。 如果三个窗口调用(其中任何一个)这些函数,则帧速率约为 20fps。 最后,如果所有四个都调用(其中一个)这些函数,则帧速率约为 15fps。

这看起来像是一种正在出现的模式,所以我尝试从 3 个窗口中删除函数,并从一个窗口调用它们 10 次。我原本预计帧速率约为 6fps,但仍保持在 60。

有人知道为什么会这样吗?如果我从窗口绘制方法中删除任何其他功能,似乎没有任何效果,例如,gluLookAt() 似乎没有减慢它。

编辑:帧速率限制设置为零,垂直同步为假。

【问题讨论】:

    标签: c++ performance sfml frame-rate


    【解决方案1】:

    这听起来很像垂直同步。您的每个窗口都在等待垂直刷新,这就是您的费率不断减半的原因。

    我知道您说 vsync 已关闭,但您的视频驱动程序可能会强制它。检查您的驱动程序设置。

    【讨论】:

    • 实际上这听起来是对的。我不知道如何使用在 MacBook-Pro 上运行的 (X)Ubuntu Linux 来做到这一点。我记得大约一个月前曾经遇到过这样的问题,因此我订购了一台带有真正图形处理器的新笔记本电脑。不过还在等它……但是:有什么办法可以解决这个问题吗?
    • 如果驱动程序强制垂直同步,你唯一能做的就是在驱动程序中禁用它。从个人经验来看,nvidia Linux驱动似乎有这方面的bug,默认强制vsync。我发现启动和退出 nvidia-settings 应用程序会将其关闭。
    • 这对我不起作用 - 启动时我收到错误消息“您似乎没有使用 nvidia 驱动程序” - 猜我使用的是英特尔驱动程序?
    • 如果不了解系统的详细信息,很难说。无论哪种方式,这是一个用户控制的选项,因此如果您打算将此程序发布给其他人,则无法阻止他们启用全局垂直同步。我能想到的在应用程序级别处理此问题的唯一方法是为每个窗口设置一个专用线程,以便它们可以并行同步,但我知道多线程 OpenGL 可能是一件棘手的事情,而且我没有个人经验那个。
    • 是的,我认为这是不可能的,因为您在视频内存中绘制到一个表面......并且只有一个可以绘制......
    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多