我正在C#/ WinForms中编写动画应用程序(请参见this question)。基本上,我应用程序中的动画是平滑的,但显示出撕裂效果;当我拍摄相同的动画并将其渲染为AVI文件并使用Windows Media Player播放时,该动画完全没有显示撕裂效果。我知道WMP不会更改帧速率,因为动画与音乐同步。
我假设WMP使用DirectX或其他知道监视器刷新率和扫描线位置等的技术,但是我一直认为编程刷新率会限制帧速率。显然,WMP并非如此。
有谁知道WMP(或其他视频播放器)如何在内部渲染视频吗?我已经搜索过,但似乎找不到任何详细信息。
最佳答案
自从我进行DirectX编程以来已经有一段时间了,所以这可能已经过时了。
据我所记得,使用DirectX可以设置一个翻转缓冲区链,通常是三个缓冲区:要显示的缓冲区,要显示的缓冲区和要写入的缓冲区。在更新中,DirectX将等待垂直同步,然后再更新显示的缓冲区。现在,这将导致显示的图像与应显示的图像之间出现差异,但这最多只能进行一次刷新,大约为1/60秒,因此您不太可能注意到。
一些ASCII艺术来说明我的意思:
|-|-|-|-|-|-|-|-|-|-|-|-|-|-| - screen refresh
|----|----|----|----|----|--- - animation
|-----|---|-----|---|-----|-- - displayed