我们知道,WPF有两大特性:1、使用DirectX渲染;2、分辨率无关性:WPF使用与设备分辨率无关的单位来度量计算显示界面的像素点,相同大小的情况下,分辨率越高,像素点就会越多。因此在WPF中,使用矢量图(会根据WPF进行缩放,清晰度不变)比位图(固定像素点,缩放会出现锯齿,并且占用空间大)更合适。
在WPF问世之前,传统的Windows应用程序都依靠如下两部分来创建用户界面:
User32:该部分为许多元素(如窗口、按钮和文本框等)提供了熟悉的Windows外观。
GDI/GDI+:该部分为渲染简单形状、文本以及图像提供了绘图支持,但增加了复杂程度(而且通常性能较差)。
后针对User32和GDI/GDI+的限制发行了 DirectX 技术,起初用于开发游戏,注重速度,由显卡支持,可以实现复杂的纹理映射、特殊效果(如半透明)以及三位图形所需的硬件加速功能。
WPF应用程序在底层都是使用DirectX,因此具有两大优势:①可使用丰富的效果;②显卡硬件加速。
但是WPF默认是使用硬件加速的,所以如果在8K屏下,显卡的性能不如意,会出现WPF应用卡顿的问题:
1、例如在WPF应用在8K屏播放视频,不管是使用MediaElement(实际上是对MediaPlayer的封装,因为增加了重业务,所以相对于MediaPlayer,性能方面会差一些)还是MediaPlayer的方式,都会出现卡顿的效果。
1)该问题尝试对视频的格式进行处理(包括帧率,码率,视频编码,关闭GPU加速等),仍然没办法解决卡顿的问题。
2)通过对启动的exe->右键属性->兼容性->更改高的DPI设置->勾选替代高DPI缩放行为->选择应用程序(该造成的作用在于:避免应用程序在使用不同显示分辨率的监视器之间移动造成的影响),仍然没办法解决卡顿的问题。
2、如果显卡偶现异常情况,可能会造成视频的画面为黑色,音频仍然可以播放的情况。
针对上面的情况,目前找到比较好的办法是:禁用硬件加速
不要在app.xaml.cs的OnStartup中添加
应该在需要禁用的页面禁用,离开该页面再启用硬件加速,不然可能会出现一些高渲染的控件出现卡顿效果。
RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;
禁用硬件加速后,MediaElement在Stop后不再卡顿,但是视频在播放的时候,仍然会存在卡顿的情况。
把AllowsTransparency设置为False,能起到一点卡顿优化的作用
如果设计到窗体圆角功能,AllowsTransparency设置为False之后圆角会出现一个黑色的尖角,可以使用WindowChrome去除,在Window窗体下添加
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="8"
UseAeroCaptionButtons="False"
NonClientFrameEdges="None"
CornerRadius="8"
ResizeBorderThickness="0">
</WindowChrome>
</WindowChrome.WindowChrome>