博客 / 詳情

返回

對比 Avalonia 和 WPF 的渲染延遲

此測試發現了 WPF 的渲染非常跟輸入,而 Avalonia 明顯落後

在我的測試用例裏面,特別讓 Avalonia 窗口去接收輸入,讓 Avalonia 驅動 WPF 的界面。如此可以排除 Avalonia 的輸入層帶來的延遲。完全只對比 Avalonia 和 WPF 的渲染層

詳細請參閲: https://github.com/AvaloniaUI/Avalonia/discussions/20562

實驗情況如下圖所示,藍色為 Avalonia 的控件,紅色是 WPF 的控件

本次測試用的 Avalonia 版本為 11.3.11 版本

具體實驗設計如下:

  • 新建 WPF 和 Avalonia 空白項目
  • 分別在 WPF 和 Avalonia 項目的界面添加不同顏色的 Border 控件。且附加上 TranslateTransform 到 Border.RenderTransform 屬性上,用於讓 Border 控件被移動
  • 讓 WPF 窗口背景透明,且通過 GWL_HWNDPARENT (SetOwner) 讓 WPF 窗口顯示在 Avalonia 窗口之上。如此運行項目可在同一屏幕上看到 Avalonia 和 WPF 框架的兩個窗口,其中 WPF 窗口作為透明窗口疊加在 Avalonia 窗口之上
  • 在 Avalonia 框架內監聽 Pointer 的按下和移動,當移動的時候設置 Border 的 TranslateTransform 的 X 座標。隨後將此座標變更發送給到 WPF 應用,讓 WPF 應用內的 Border 也做相同的 TranslateTransform 變換
  • 脱離 Visual Studio 獨立運行項目,使用鼠標或觸摸移動 Border 控件

本文所採用的測試代碼放在 github 和 gitee 上,可以使用如下命令行拉取代碼。我整個代碼倉庫比較龐大,使用以下命令行可以進行部分拉取,拉取速度比較快

先創建一個空文件夾,接着使用命令行 cd 命令進入此空文件夾,在命令行裏面輸入以下代碼,即可獲取到本文的代碼

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 3f38106c92a2a645e0df7b27731b5f84f3e16f78

以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令行繼續輸入以下代碼,將 gitee 源換成 github 源進行拉取代碼。如果依然拉取不到代碼,可以發郵件向我要代碼

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 3f38106c92a2a645e0df7b27731b5f84f3e16f78

獲取代碼之後,進入 AvaloniaIDemo/HohaychukeajeherLelfeajune 文件夾,即可獲取到源代碼

回答一些疑惑:

  • 按照以上的實驗設計,輸入層是從 Avalonia 框架來的,意味着 Avalonia 在輸入處理方面還比 WPF 執行得更早。至少 WPF 需要等待 Dispatcher 調度之後才能收到輸入
  • 無論是 WPF 還是 Avalonia 框架,都執行了相同的上層邏輯代碼,都通過 RenderTransform 進行變換
  • 為什麼不使用動畫而是使用輸入來測試?因為 WPF 和 Avalonia 的動畫模塊有很大的實現差異,為了控制變量,選擇使用輸入來做
  • 選擇讓 WPF 窗口是透明的,如此可以讓 WPF 框架承擔透明窗口帶來的更多渲染代價。在 WPF 框架承受了透明窗口渲染代價的前提下,依然能夠輕鬆領先於 Avalonia 框架,如此更可説明 Avalonia 框架的渲染延遲性
  • 在實際實驗中,在 4K 分辨率的觸摸屏上,能夠感受到更大的差異,可見 Avalonia 更落後於 WPF 框架
  • 是否設置 Avalonia 使用 LowLatencyDxgiSwapChain 能夠解決此問題?設置 LowLatencyDxgiSwapChain 只能緩解問題,但依然在渲染延遲上落後與 WPF 框架
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.