问题

在近期项目中,我使用了 WPF 原生的 MediaElement​ 媒体控件来播放视频。然而,当我的笔记本连接外接显示屏时,程序中 MediaElement​ 控件播放视频会出现短暂卡顿,尤其是在每次实例化该控件并自动播放视频时。而当我断开外接显示屏后,MediaElement​ 控件则能正常播放视频。经过仔细研究,我发现笔记本在外接显示屏的情况下运行该程序时,会自动调用 GPU 加速。由此我得出结论:

在 WPF 中使用 MediaElement​ 控件时,其自动调用 GPU 加速是导致视频卡顿的原因。

解决

1. 禁用硬件加速

在需要禁用硬件加速的页面中,可以在App.xaml.cs​OnStartup​方法中设置RenderOptions.ProcessMode​属性为SoftwareOnly​。这样可以确保MediaElement在停止播放后不再出现卡顿现象。但需要注意的是,禁用硬件加速可能会导致播放时仍然出现卡顿,尤其是在高分辨率(如8K)或复杂场景下,WPF默认的硬件加速可能成为性能瓶颈。可以通过以下代码在特定页面禁用硬件加速:

RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;

并在离开页面后重新启用硬件加速以恢复其他功能的性能。此方法能显著缓解UI卡顿,但可能影响播放时的流畅度。

2. 关闭透明效果

将AllowsTransparency​属性设置为False​,避免透明层叠加带来的额外渲染开销:

<Window AllowsTransparency="False">