2

我正在用 C#/WinForms 编写一个动画应用程序(参见这个问题)。基本上,我的应用程序中的动画很流畅,但显示出撕裂效果;当我拍摄相同的动画并将其渲染为 AVI 文件并使用 Windows Media Player 播放时,动画完全没有显示撕裂效果。我知道 WMP 不会改变帧速率,因为动画与音乐同步。

我假设 WMP 使用 DirectX 或其他一些知道显示器刷新率和扫描线位置等的技术,但我一直认为对刷新率进行编程会限制帧率。显然,WMP 并非如此。

有谁知道 WMP(或其他视频播放器)如何在内部渲染视频?我已经搜索过,但似乎找不到有关此的任何详细信息。

4

2 回答 2

5

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

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

一些 ASCII 艺术来说明我的意思:

|-|-|-|-|-|-|-|-|-|-|-|-|-|-|  - screen refresh
|----|----|----|----|----|---  - animation 
|-----|---|-----|---|-----|--  - displayed
于 2010-03-16T17:15:14.250 回答
1

您是否首先将动画的每一帧绘制到内存位图,然后将位图传送到您的窗口?如果没有,这可能是您的解决方案。

(这当然是双缓冲之外的)

于 2010-03-16T16:56:11.580 回答