WinUI 3 Preview 3 發布了,再一次試試它的性能

1. WinUI 3

在微軟 Build 2020 開發者大會上,WinUI 團隊宣布可公開預覽的 WinUI 3 Preview 1,它讓開發人員可以在 Win32 中使用 WinUI。最終 XAML 的新功能不再和 Windows SDK 綁定,所有新的 XAML 功能都將作為 WinUI 的一部分發布。 作為 OS 的一部分發布的現有 UWP XAML API 將不會再收到新的功能更新。 但是,它們會在 Windows 10 支援生命周期內繼續收到安全更新和關鍵修復程式。

2. WinUI 3 第三個預覽版

微軟在上個月(11 月)發布了 WinUI 3 Preview 3,具體新增的特性和功能可以看文章最後給出的參考鏈接。這裡我列出我比較重視的新特性:

  • ARM64 支援
  • 對工具/開發人員的改進:
    • 實時可視化樹, 熱重載,實時屬性資源管理器及類似工具
    • Intellisense 現適用於 WinUI 3
  • MRT 核心支援
    • 這可使應用在啟動時速度更快、更輕質,還能加快資源查找速度。
  • 性能改進

這些都是預期之內的改進。在我半年前寫的文章《WinUI 3 試玩報告》提到 Preview 1 的開發體驗和性能都未能令人滿意。這次改進了開發體驗,雖然還是沒有設計視圖,但智慧感知、實時可視化樹、熱重載等功能已經可以讓人在 Visual Studio 上進行 WinUI 3 的開發(以前都是在 UWP 項目中寫好再複製到 WinUI 項目)。

下面 WinUI 3 公開的路線圖,從這圖可以看出 WinUI 3 Preview 3 在功能上已經和正式版十分接近,恐怕正式版不會再添加很多值得玩的新功能,所以如果要嘗嘗鮮的話現在正適合。

3. 試玩 WinUI 3 Preview 3

要試玩 Preview 3,你需要具備以下條件和環境:

安裝完所有東西後,下一步要做的和上次沒什麼區別,在新建項目的介面里選擇 C# 的 「Blank App, Packaged (WinUI in Desktop)」 項目,並選擇對應的 Windows 平台創建項目。

再下一步,你就需要拿出你的愛與勇氣與希望,去網上與其他微軟粉絲交流怎麼編譯這個剛剛創建一行程式碼都沒改過就報錯的全新的 WinUI 3 項目:

Cannot build WinUI3 Preview3 desktop package project in fresh installed VS #3635

Why do you waste dev’s time with unusable releases ? #3645

有些人第一次就能編譯通過並運行,那真是太令人高興了, 已經沒什麼好害怕的了,奇蹟、魔法,都是存在的。

4. 性能改進?

經過了一段痛苦和掙扎,我終於可以運行 WinUI 3 Preview 3 了。

現在制約我將來使用 WinUI 3 的要素只剩下開發體驗和性能。開發體驗方面應該不用太擔心,將來 WinUI 3 正式版的開發體驗至少不會比 UWP 差(UWP 都忍過來了,已經沒有什們能難到我了)。另一個我比較在意的地方是性能表現,這方面還是個未知數。本來我還期待 WinUI 3 的性能只比 UWP 差一點點,可是 Preview 1 的實際表現讓人大跌眼鏡,所以在這個預覽版特地提到性能改進讓我很期待,於是我再次測試了它的性能。首先用和 《WinUI 3 試玩報告》同樣的程式碼在 Preview 3 進行了測試,結果如下:

CPU 記憶體 GPU
WPF .NET Framework 4.8 12 60 76
WPF .NET 5.0 12 85 72
UWP 3 28 36
WinUI Preview 1 5 65 95
WinUI Preview 3 6 45 76

雖然 Preview 3 依然不夠流暢,但起碼 GPU 佔用率可以和 WPF 不相上下。這個測試證明了 WinUI 3 的性能確實有了改進,如果單看這個測試的話 WinUI 3 的性能至少比 WPF 好。可是這樣還遠遠不夠好,於是我又試了另一種測試。這次我找到最近寫的 《使用離散式關鍵幀播放動畫》里的散步貓動畫。在這個測試中,WPF 和 WinUI/UWP 的 Xaml 部分完全一樣,只是動畫的程式碼部分稍微有些出入:

// Uwp and WinUI
var transform = (sender as Image).RenderTransform as CompositeTransform;
var keyFrames = new DoubleAnimationUsingKeyFrames();
Storyboard.SetTarget(keyFrames, transform);
Storyboard.SetTargetProperty(keyFrames, nameof(CompositeTransform.TranslateY));

// Wpf
var transform = (sender as Image).RenderTransform as TranslateTransform;
var keyFrames = new DoubleAnimationUsingKeyFrames();
Storyboard.SetTarget(keyFrames, sender as Image);
Storyboard.SetTargetProperty(keyFrames, new PropertyPath("RenderTransform.Y"));

當然一隻貓不足以測試性能,於是我決定同時擼 100 只貓,分別在 .Net Framework 4.8、.Net 5、Uwp、WinUI Preview 3 這 4 個平台進行測試,我的測試環境如下:

  • i7-6820HQ
  • 16G 記憶體
  • 集成顯示卡
  • 1920 * 1080 解析度,100%拉伸
  • Windows 10 20H2

測試結果如下:

CPU 記憶體 GPU
WPF .NET Framework 4.8 3 177 21
WPF .NET 5.0 3 3300 21
UWP 1 25 5
WinUI Preview 3 2 46 6
  • WPF .Net Framework 4.8:結果在預期中,177 MB 的記憶體佔用有些高,但個方面都很穩妥。
  • WPF .Net 5.0:WPF 和 WPF 之間的體質不能一概而論,WPF .Net 5.0 曾在極度普通的情況下佔用了 3300 MB的記憶體,嚇了我一跳,這種事絕對很奇怪啊,只不過 100 只貓而已,是不是擼不起?
  • UWP:表現也太優異了吧,可能是我的錯覺?不過 UWP 也並不是沒有問題,只要貓的數量再多些就會報 「Layout cycle detected. Layout could not complete.」 這個錯誤。
  • WinUI 3:性能基本和 UWP 保持一致,記憶體佔用高些。也就是說某些情況下 WinUI 3 的性能能達到 UWP 的水平,那真是太令人高興了。可惜的是同樣會在貓的數量增加後報 「Layout cycle detected. Layout could not complete.」 這個錯誤,而且 WinUI 運行起來有閃爍的現象:

5. 結論

WinUI 3 Preview 3 功能、性能、開發體驗等各方面都有所提升,尤其性能上某些情況下可以達到 UWP 的水平,但仍有奇怪的問題。總的來說,目前 XAML 平台各有各的問題,沒一個能打的。不過 XAML 仍是我最好的朋友,期待下一個版本的 WinUI 能給我驚喜。

最後,微軟更新了 WinUI 3 的 Release Roadmap,修改了 WinUI 3 的發布計劃。希望正式版快些到來吧,不然 MAUI 要加入戰局了。

6. 參考

Announcing WinUI 3 Preview 3! ✨🎉:
//github.com/microsoft/microsoft-ui-xaml/issues/3620

Windows UI 庫 3 預覽版 3(2020 年 11 月):
//docs.microsoft.com/zh-cn/windows/apps/winui/winui3/?WT.mc_id=WD-MVP-5003763

Windows UI Library Roadmap :
//github.com/microsoft/microsoft-ui-xaml/blob/master/docs/roadmap.md#winui-30-feature-roadmap