gpt4 book ai didi

c# - Windows XP 上的 WPF 视频撕裂

转载 作者:太空宇宙 更新时间:2023-11-03 11:55:49 26 4
gpt4 key购买 nike

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

虽然一切正常,但我注意到随着相机的移动,会出现难看的视频撕裂现象。

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

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

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

我真的希望有一个解决方案,毕竟 Windows 窗体多年来一直采用双缓冲。如果没有解决方案,迁移到 WPF 实际上是许多类型应用程序的倒退。

那么,在 Windows XP 上,我如何配置 WPF 来消除撕裂?

我正在寻找比“迁移到 Vista”更有帮助的答案。对于此应用程序的许多 future 用户来说,这根本不可能。

最佳答案

还没有答案,肯定有很多 WPF 开发人员已经看到这个问题了吗?

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

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

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

相反,我本来希望需要在更全局的级别上执行此操作,比如在视口(viewport)上,但是我在视口(viewport)对象上找不到 DesiredFramerate 属性。

要查看的另一个区域可能是 RenderCapability.Tier但我还没有时间详细查看。

[更新]

没有解决办法,只有一个有用的提示。要全局设置 DesiredFramerate(即视口(viewport)中的所有动画),您可以覆盖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,它也不能与监视器垂直同步足够准确地同步。

虽然知道这一点很方便,特别是如果您有缓慢移动的动画并且想通过将 FPS 设置得比默认的 60fps 低得多来节省 CPU 使用率。

[更新]

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

关于c# - Windows XP 上的 WPF 视频撕裂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/531878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com