我正在用C#/ WinForms编写一个动画应用程序(参见this question)。基本上,我的应用程序中的动画是流畅的,但显示撕裂效果;当我拍摄相同的动画并将其渲染为AVI文件并使用Windows Media Player播放时,动画根本不显示撕裂效果。我知道WMP没有改变帧速率,因为动画与音乐同步。
我假设WMP使用DirectX或其他一些了解显示器刷新率和扫描线位置等的技术,但我总是认为编程到刷新率会限制帧速率。显然,WMP并非如此。
有没有人知道WMP(或其他视频播放器)如何在内部呈现视频?我搜索过,但似乎无法找到有关此问题的任何细节。
答案 0 :(得分:5)
我做了任何DirectX编程已经有一段时间了,所以这可能已经过时了。
根据我的记忆,使用DirectX,您可以设置一个翻转缓冲区链,通常是三个缓冲区:显示的缓冲区,要显示的缓冲区和写入的缓冲区。在更新时,DirectX将在更新显示的缓冲区之前等待V-sync。现在,这将导致显示的图像与应该显示的图像之间存在差异,但这最多只能刷新一次,大约是1/60秒,因此您不太可能注意到。
一些ASCII艺术来表明我的意思:
|-|-|-|-|-|-|-|-|-|-|-|-|-|-| - screen refresh
|----|----|----|----|----|--- - animation
|-----|---|-----|---|-----|-- - displayed
答案 1 :(得分:1)
首先将动画的每个帧绘制到内存位图,然后将位图显示到窗口?如果没有,这可能是你的解决方案。
(当然,除了双缓冲之外)