我們知道,WPF有兩大特性:1、使用DirectX渲染;2、解析度無關性:WPF使用與設備解析度無關的單位來度量計算顯示界面的像素點,相同大小的情況下,解析度越高,像素點就會越多。因此在WPF中,使用矢量圖(會根據WPF進行縮放,清晰度不變)比點陣圖(固定像素點,縮放會出現鋸齒,並且占用空間大)更合適 ...
我們知道,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>