gpt4 book ai didi

opengl - 如何为每个垂直同步执行一次渲染(不重复,不跳过)?

转载 作者:行者123 更新时间:2023-12-02 16:40:03 53 4
gpt4 key购买 nike

我正在尝试进行垂直同步渲染,以便每个垂直同步只完成一个渲染,而不跳过或重复任何帧。我需要它在 Windows 7 和(将来)Windows 8 下工作。

它基本上包括绘制一个适合屏幕的QUADS序列,以便原始图像中的像素与屏幕上的像素1:1匹配。渲染部分不是问题,无论是OpenGL还是DirectX。问题在于正确的同步。

我之前尝试过使用 OpenGL 和 WGL_EXT_swap_control 扩展,通过绘制然后调用

SwapBuffers(g_hDC);
glFinish();

我尝试了这两个指令的所有组合和排列以及 glFlush(),但它不可靠。

然后我尝试使用 Direct3D 10,通过绘图然后调用

g_pSwapChain->Present(1, 0);
pOutput->WaitForVBlank();

其中,g_pSwapChain 是一个 IDXGISwapChain*pOutput 是与该 SwapChain 关联的 IDXGIOutput*

OpenGL 和 Direct3D 这两个版本都会产生相同的结果:例如,60 帧的第一个序列没有持续应有的时间(而不是在 60hz 时持续大约 1000 毫秒,而是持续了 1030 或 1050 毫秒),下面的似乎工作正常(大约1000.40ms),但时不时地它似乎会跳过一帧。我使用 QueryPerformanceCounter 进行测量。

在 Direct3D 上,尝试仅使用 WaitForVBlank 的循环,1000 次迭代的持续时间始终为 1000.40,几乎没有变化。

所以这里的问题是不知道每个函数何时调用返回,以及交换是否在垂直同步期间完成(不是更早,以避免撕裂)。

理想情况下(如果我没有弄错的话),要实现我想要的效果,将执行一次渲染,等到同步开始,在同步期间交换,然后等到同步完成。如何使用 OpenGL 或 DirectX 做到这一点?

编辑:WaitForVSync 60x 的测试循环持续从 1000.30ms 到 1000.50ms。在 WaitForVSync 之前使用 Present(1,0) 进行相同的循环,没有其他任何东西,没有渲染,花费相同的时间,但有时会失败并花费 1017ms,就好像有重复了一帧。没有渲染,所以这里有问题。

最佳答案

我在DX11中也遇到同样的问题。我想保证我的帧渲染代码采用显示器刷新率的精确倍数,以避免多缓冲延迟。

仅调用 pSwapChain->present(1,0) 是不够的。这将防止全屏模式下的撕裂,但它不会等待 vblank 发生。当前的调用是异步的,如果还有帧缓冲区需要填充,它会立即返回。因此,如果您的渲染代码非常快地生成新帧(例如 10 毫秒渲染所有内容),并且用户已将驱动程序的“最大预渲染帧”设置为 4,那么您将比用户看到的提前渲染 4 帧。这意味着鼠标操作和屏幕响应之间有 4*16.7=67ms 的延迟,这是 Not Acceptable 。请注意,驱动程序的设置获胜 - 即使您的应用要求 pOutput->setMaximumFrameLatency(1),您也将获得 4 帧。因此,无论驱动程序设置如何,保证没有鼠标滞后的唯一方法是让渲染循环自动等待下一个垂直刷新间隔,这样您就永远不会使用这些额外的帧缓冲区。

IDXGIOutput::WaitForVBlank() 就是用于此目的。但这不起作用!当我调用以下内容时

<render something in ~10ms>
pSwapChain->present(1,0);
pOutput->waitForVBlank();

我测量了 waitForVBlank() 调用返回所需的时间,我发现它大约在 6 毫秒和 22 毫秒之间交替。

怎么会发生这种事? waitForVBlank() 的完成时间怎么可能超过 16.7 毫秒?在 DX9 中,我们使用 getRasterState() 解决了这个问题,以实现我们自己的、更准确的 waitForVBlank 版本。但该调用在 DX11 中已被弃用。

有没有其他方法可以保证我的帧与显示器的刷新率完全一致?是否有另一种方法可以像 getRasterState 那样监视当前的扫描线?

关于opengl - 如何为每个垂直同步执行一次渲染(不重复,不跳过)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10499734/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com