2011-02-04 84 views
0

一个珍闻在游戏中我们的互联网组装团队编程,我们假设从我们的观众每个人都会有大大超过在比赛中全速。完美的V-同步实施:需要的信息

所以,保存视频RAM,并希望给多一点空闲时间到显卡,采用V-不同步双缓冲将是我们最好的选择。所以,在OpenGL中,我们需要知道如何做到这一点。

从我的理解,垂直同步时,一旦它完成渲染一帧,直到帧已经完成发送到显示设备显卡被暂停。双缓冲不会暂停渲染操作(或者它可能,或者它可能是特定于实现的;不确定),因为它在复制到帧缓冲区之前会将其绘制到第二个缓冲区,以便监视器获得全帧或无新的帧(特别是帧缓冲区中的最后存储的图像)。好吧,我们不需要这个功能,只要显卡只在它需要的时候才写入framebuffer。

这是一个非常缓慢的在线游戏(但它非常有创意^ _ ^)。有很少的实时行动。因此,非常精确的用户输入不是必需的;它可以在渲染帧之前的任何时候作为单个单元从OS捕获。

所以,为了做正是这一点,我需要能够得到一个“帧发送完监视”从OpenGL的消息。可能吗?如果不是,最好的选择是什么?

游戏进行编程仅适用于Windows的时刻,但应该有几个月的Linux所做的工作。

+0

视频卡被设计成具有双缓冲足够的内存。所有的游戏都在使用它。此外,驱动程序层不会直接控制“帧何时发送到显示器”。对于这个问题,你准备好用多台显示器来处理这些情况吗?你愿意只工作在全屏吗? – Bahbar 2011-02-04 08:44:23

回答

8

您受V-Sync所做错误观念的影响。视频RAM中有一部分以恒定速率连续发送到显示设备,即帧刷新率。所以在一个完整的帧被发送之后,下一帧在非常短的空白时间之后被发送。但发送帧之间的时间比发送全帧所用的时间要短得多。

没有V-Sync会发生什么情况,帧缓冲区内容的操作是可见的,例如,如果帧被红色和绿色交替填充,并且没有V-Sync,您将看到红色和绿色波段显示器。为了避免这种情况,V-Sync会在显示驱动程序发送完整帧后立即交换显示驱动程序用于访问帧缓冲区的指针。

这给我们带来了什么doublebuffering。没有双缓冲,V-Sync几乎没有用处。由V-Sync触发的动作必须非常快速地发生。因此,这可以归结为交换指针或非常快速的blitting操作(可能通过简单地为GPU的MMU设置CoW属性)。

没有doublebuffering和无V-Sync中的效果是,可以看到,其中的图像是由一块呈现片到帧缓冲器的过程。当然,如果发生了渲染比帧周期更快,这具有自上而下的,你会看到一个只有人口稀少的图像有越来越多的内容向bottem可见,并且中间某个位置,它会击中屏幕下方边缘的影响,绕到顶部。相交线将会移动。

TL; DR:只是使用双缓冲,使垂直同步用于缓冲交换。不要害怕内存消耗。目前流通的所有GPU都拥有足够的内存来轻松为双缓冲色彩平面提供内存。只需做数学运算:1920x1200 * RGB = 6MiB,即使是目前个人电脑中最小的GPU也能提供至少128MiB的RAM。移动设备,比如iPad 1024 * 768 * RGB = 2MiB与32MiB的图形。无论如何,iPad的UI都是双缓冲的。

0

您可以使用wglGetProcAddress来获取地址wglSwapIntervalEXT,然后拨打wglSwapIntervalEXT(1);以使更新与垂直同步同步。当你这样做时,你不会在垂直同步中收到消息 - 而是glFlush直到发生垂直回退时才会返回,并且屏幕已更新。所以,你有一个WM_PAINT处理,看起来是这样的:

BeginPaint 
wglMakeCurrent 
do drawing 
glFlush 
EndPaint 

glFlush需要在任何情况下,确保你已经做了被发送到屏幕上绘图。

+0

允许OGL实现执行暂停听起来更加优雅和“有意”,但我必须在单独的线程中运行它才能捕获输入。 (不是问题)。另外,您指向的函数使用单独的绘图缓冲区,如果刚刚在监视器读取后立即将帧渲染到帧缓冲区中,则不需要该缓冲区。我希望我不会听起来固执地寻找特定的答案......因此,如果没有人用更好的解决方案做出回应,那么我会和你的(和整个互联网,就像大量的谷歌搜索所示)一样提出建议。谢谢杰里。 – daddesio 2011-02-04 07:13:10

+0

哦,嘿!扫描通过了OpenGL规范,我发现有一个GLX扩展glXWaitForMscOML,它等待MSC(媒体流计数器),“一个计数器所特有的对发生的每个垂直回扫图形子系统和增量”。不幸的是,我怀疑WGL是否有相同的功能。有趣的是,这可以绕过用户可能在其图形设置中设置的任何“强制v同步关闭”选项。这让我感觉很糟糕:P,但在这种情况下,它肯定会更好。 – daddesio 2011-02-04 07:37:24