C# Windows Media Player如何处理监视器刷新率?

C# Windows Media Player如何处理监视器刷新率?,c#,animation,directx,windows-media-player,C#,Animation,Directx,Windows Media Player,我正在用C#/WinForms编写一个动画应用程序(请参阅)。基本上,我的应用程序中的动画是平滑的,但显示撕裂效果;当我拍摄相同的动画并将其渲染到AVI文件并使用Windows Media Player播放时,该动画根本不会显示撕裂效果。我知道WMP不会改变帧速率,因为动画与音乐同步 我假设WMP使用DirectX或其他一些技术,可以了解监视器的刷新率和扫描线位置等,但我始终认为,按照刷新率编程会限制帧速率。显然,WMP的情况并非如此 有人知道WMP(或其他视频播放器)如何在内部渲染视频吗?我已

我正在用C#/WinForms编写一个动画应用程序(请参阅)。基本上,我的应用程序中的动画是平滑的,但显示撕裂效果;当我拍摄相同的动画并将其渲染到AVI文件并使用Windows Media Player播放时,该动画根本不会显示撕裂效果。我知道WMP不会改变帧速率,因为动画与音乐同步

我假设WMP使用DirectX或其他一些技术,可以了解监视器的刷新率和扫描线位置等,但我始终认为,按照刷新率编程会限制帧速率。显然,WMP的情况并非如此


有人知道WMP(或其他视频播放器)如何在内部渲染视频吗?我已经搜索过了,但我似乎找不到关于这个的任何细节

您是否先将动画的每一帧绘制到内存位图,然后再将位图分屏到窗口?如果不是,这可能是您的解决方案

(当然,这是对双缓冲的补充)

我已经有一段时间没有做任何DirectX编程了,所以这可能已经过时了

根据我的记忆,使用DirectX可以设置一个缓冲区的翻转链,通常有三个缓冲区:正在显示的缓冲区、要显示的缓冲区和写入的缓冲区。在更新时,DirectX将在更新显示的缓冲区之前等待V-sync。现在,这将导致显示的图像和应该显示的图像之间出现差异,但这最多是一次刷新,大约是1/60秒,因此您不太可能注意到

一些ASCII艺术来展示我的意思:

|-|-|-|-|-|-|-|-|-|-|-|-|-|-|  - screen refresh
|----|----|----|----|----|---  - animation 
|-----|---|-----|---|-----|--  - displayed

“我知道WMP没有改变帧速率,因为动画与音乐同步。”-我可能错了,但我不相信这是一个正确的说法。帧速率与音乐的同步无关。帧速率越高,动画越平滑。不是动画执行的速度。转换为AVI格式可能会将视频帧速率重新采样为WMP可以播放的无伪影的视频。@Skizz:WMP将仅使用垂直同步渲染视频,以防止撕裂。视频的帧速率与此无关。你在使用什么技术来生成伪影?@Jason:澄清一下,我的意思是,如果,比如说,我的动画的帧速率是19.33333左右,而WMP实际上以20的帧速率播放(与我的60Hz显示器保持同步),然后,动画将缓慢漂移,与音乐(也添加到AVI文件)不同步。因为这种漂移不会发生,我知道WMP的动画速度是每秒19.33333帧。我打算在这个问题上提出一个免责声明,即引用双缓冲,以及设置控件样式,覆盖PaintBackground和所有其他为避免闪烁而必须做的事,希望能让人们相信我真的有流泪的问题。:)妈的,看来这就是我要做的。我希望我可以做一些简单的事情,比如只使用DirectX来告诉我显示器何时处于垂直空白期,并将渲染推迟到VBP。除非我错误地低估了这一点,否则这将以运动中偶尔的小打嗝为代价消除撕裂。