我创建了两个通过PBO呈现视频的OpenGL窗口。我无法弄清楚的是为什么第二个窗口或第二个窗口要渲染第二个窗口总是比第一个窗口长得多?我意识到这可能是供应商特定的,因为我只在nVidia Quadro产品上观察过。
一些伪代码:
pixels[]
for (num_windows)
{
gettimeofday(t0)
window.display(pixels)
gettimeofday(t1)
delta = t1 - t0
}
第一个窗口的增量通常小于5毫秒,大多数情况下第二个窗口的增量大于10毫秒。这是为什么?
答案 0 :(得分:2)
这不是用于计算渲染所需时间的合适方法,因为CPU和GPU是异步的,并且在缓冲区交换期间可能发生阻塞和/或命令队列变满。如果您使用的是较新的OpenGL实现,则应使用Timer Queries
。
如果没有看到display (...)
的实现以及每个窗口的不同之处,我只能猜测像VSYNC这样的东西应该受到责备(尤其是当你提到的两次加起来几乎达到60 Hz时)。启用VSYNC的交换缓冲区将阻塞调用线程,直到适当的时间。第一次执行此操作时可能比第二次更短,因为第二次将在VSYNC间隔开始时立即启动。
您可能希望在CPU之间绘制一个窗口和另一个窗口时执行一些有用的操作,这样就不会完全浪费阻塞所花费的时间。或者,您可以考虑使用多线程渲染,一个线程驱动每个窗口的缓冲区交换。这是多线程渲染确实有意义的一种情况。