c++ - Qt 5.1.1 和 OpenGL - 渲染速度

标签 c++ windows qt opengl

我基于以下 Qt 类创建了我的 OpenGL 应用程序:QWindow、QOpenGLContext、QOpenGLFunctions_4_3_Core。我使用 QTimer 渲染场景:

QTimer* timer = new QTimer( this );
connect( timer, SIGNAL( timeout() ), this, SLOT( renderScene() ) );
timer->start( ms );

当 ms = 0 时,我可以检查最大 FPS。结果是 ~2200 fps(垂直同步关闭),但是当我想使用鼠标调整窗口大小时,程序挂断了。然后我必须使用“ctrl+ alt + del”并手动终止进程(调试器不包含任何消息)。可能出了什么问题?

我也想知道为什么当定时器间隔设置为 1(应该是 1000 fps)时我得到 64 fps。其他结果:interval = 10 也是 64 fps,interval = 50 -> 16 fps,interval = 100 -> 9 fps。只有最后的结果 (100 ms -> 9fps) 似乎是正确的。如何解释这些结果?

最佳答案

考虑到您使用以下命令关闭程序,我假设您使用的是 Windows

ctrl+ alt + del

ms = 0你确实在测量处理性能renderScene()尽可能快地使用事件。当 Qtimer 超时时,它会排队一个 QTimerEvent .你的计时器一直超时和排队QTimerEvent并淹没事件队列。当您调整窗口大小时,调整大小事件将放置在充满计时器事件的队列中,并且只会在这些事件之后处理。由于事件没有被应用及时处理,导致应用出现无响应

ms != 0您的测量结果不准确,因为操作系统计时器不准确。当我开发多平台播放器时,我注意到在我的窗口上,从 1 毫秒到 15 毫秒的任何时间延迟都在 15 毫秒左右something which can be tested directly .如果您在 Linux 上运行相同的测试,您将看到 1 毫秒的 fps 比 10 毫秒更好(仍然不能保证 1 毫秒的分辨率)

总结一下:

  • 测试结果的差异与 Open-GL 无关
  • 你测试结果的差异与Windows有很大关系
  • 操作系统和操作系统版本的时间差异是使用外部设备生成时间码的充分理由
  • 如果您在实际程序中需要一个零延迟计时器(您很可能需要),它需要在与主事件队列不同的事件队列中运行。

编辑: ms != 0 的上述参数对 Qt 4.8 有效,默认为 TimerType ( Qt::CoarseTimer ) 在 Qt 5 中。您可以使用 setTimerType(Qt::PreciseTimer)对于毫秒精度,但是 it is not guaranteed to succeed :

On Windows, Qt will use Windows's Multimedia timer facility (if available) for Qt::PreciseTimer and normal Windows timers for Qt::CoarseTimer and Qt::VeryCoarseTimer.

关于c++ - Qt 5.1.1 和 OpenGL - 渲染速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19958788/

相关文章:

c++ - 如何将Qwt图绘制到图像中

c++ - 混合 typedef 和 CRTP?

windows - 在 Windows 上,如何找到给定进程正在使用的文件?有没有软件可以做到这一点?

c++ - MATLAB 代码与 C/C++ 集成时出现 fatal error

windows - 我的基于 Windows 的 32 位视频应用程序在 Win7/64 或 Vista/64 下无法运行?

windows - Windows下使用PyQt的Webkit无法通过xhr获取远程资源

c++ - 如何在 rtl 对齐中打开右侧的子菜单?

c++ - 在 Qt 5.7 C++ 中创建简单对象

c++ - 使用 std::variant 的 swifty objective-c++

c++ - 我应该如何正确地从 C++ 初始化 C 结构?