C# 如何确定监视器何时刚刚刷新屏幕?

C# 如何确定监视器何时刚刚刷新屏幕?,c#,windows,monitor,vsync,C#,Windows,Monitor,Vsync,我想将Direct3D9应用程序中的渲染与监视器的刷新率同步。我希望避免使用VSync,因为它会在渲染每个帧之前锁定处理,从而降低帧速率。最后,我希望每秒仅“呈现”一帧60次,并在每次调用“呈现”之间处理帧数据 有没有办法“挂接”监视器?为什么不将渲染管道的缓冲区增加一倍(或三倍)?您不需要暂停处理来等待vsync;你只需要确保除了在vsync过程中,你不会翻转到下一个缓冲区。@PeterDuniho我同意三重缓冲,但是“确保除了在vsync过程中,你不会翻转到下一个缓冲区”是什么意思?有了三重

我想将Direct3D9应用程序中的渲染与监视器的刷新率同步。我希望避免使用VSync,因为它会在渲染每个帧之前锁定处理,从而降低帧速率。最后,我希望每秒仅“呈现”一帧60次,并在每次调用“呈现”之间处理帧数据


有没有办法“挂接”监视器?

为什么不将渲染管道的缓冲区增加一倍(或三倍)?您不需要暂停处理来等待vsync;你只需要确保除了在vsync过程中,你不会翻转到下一个缓冲区。@PeterDuniho我同意三重缓冲,但是“确保除了在vsync过程中,你不会翻转到下一个缓冲区”是什么意思?有了三重缓冲,我就不能完全消除vsync吗?这就是我想做的,因为我需要处理帧之间的数据…通过“翻转”,我的意思是改变显示的缓冲区。通常,除了在vsync期间,您希望避免这样做,以防止撕裂。您可以对代码进行结构化,以便一个线程执行数据处理(即生产者线程),另一个线程执行缓冲区表示(即消费者线程)。消费者线程会在vsync过程中翻转缓冲区,防止撕裂,同时也会给你一个信号,你可以用它来知道何时发生了vsync(从你的帖子中不清楚你为什么想要知道这一点……我只是想当然地认为有一个真正的需要:)。@PeterDuniho那么,这个想法是在使用多线程的同时使用vsync吗?当vsync等待监视器刷新信号时,“生产者线程”会执行吗?我不明白为什么不会执行,但它确实取决于您尚未共享的确切代码。等待的线程将是使用者线程;它将在vsync上等待,并且可能还必须在producer线程上等待(如果场景太复杂,无法以监视器的刷新率渲染)。如果生成线程能够以高于监视器刷新率的速度生成帧,那么您可能最终不得不限制生成线程。同样,您不太清楚您需要什么样的数据处理;如果它与实际渲染无关,则可以让它不受限制地运行。