WPF视频在Windows XP上撕裂

时间:2009-02-10 11:12:43

标签: c# wpf graphics

我使用C#创建了一个WPF应用程序,它渲染了大约50个3D元素并为相机设置动画以便在场景中移动。

虽然一切正常,但我注意到随着相机的移动,发生了丑陋的视频撕裂。

我很清楚撕裂的标准原因,即应用程序正在以与监视器/适配器垂直同步不同的速率更新帧。

我还读到WPF中的默认屏幕更新速率是每秒60帧,而XP WPF更新速率without regard to the montior v-sync

对于某些场景来说,撕裂不太明显,但往往会分散注意力,成为一个真正的问题。

我真的希望有一个解决方案,毕竟Windows Forms已经有多年的双缓冲。如果没有解决方案,迁移到WPF对许多类型的应用程序来说都是一个向后的步骤。

因此,在Windows XP上,如何配置WPF以消除撕裂?

我正在寻找更有用的答案然后“转移到Vista”。对于此应用程序的许多未来用户而言,这是不可能的。

1 个答案:

答案 0 :(得分:2)

还没有答案,肯定有WPF开发人员在那里有其他人看到过这个问题吗?

与此同时,我已经调查/阅读了更多内容并且遇到了Timeline.DesiredFrameRate属性。

当我的显示器以50hz垂直刷新运行时,我尝试将其设置为50 FPS,希望这会使事情同步。不幸的是,这对撕裂没有影响。

但是,我确实必须将它应用于我使用BeginAnimation()创建的单个特定动画(在代码中)。我不确定这会如何影响“全局”帧速率。

相反,我希望在更全局的层面上这样做,比如在视口上,但是我在viewport对象上找不到DesiredFramerate属性。

另一个值得关注的领域可能是RenderCapability.Tier,但我还没有时间仔细研究。

[更新]

没有解决方案,但有用的提示。要全局设置DesiredFramerate(即视口中的所有动画),您可以覆盖PropertyMetadata Timeline.DesiredFrameRateProperty依赖属性:

// Set the global desired framerate to 50 frames per second
Startup += delegate(object sender, StartupEventArgs e)
{
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),
     new PropertyMetadata(50));
};

最好将它放在标准WPF Application类的构造函数中。

不幸的是,这并没有解决我的问题,因为即使将其设置为FPS,也不能使用监视器v-sync足够准确地同步。

虽然知道这一点很方便,特别是如果你的移动动画很慢并希望通过将FPS设置为低于默认的60fps来节省CPU使用率。

[更新]

将DesireFrameRate设置为某些非常高的值(例如100+)似乎会减少但不会消除闪烁。然而,一个很大的缺点是CPU(在我的4台PC上)达到了35%。