1. 程式人生 > >WinUI 3 Preview 3 釋出了,再一次試試它的效能

WinUI 3 Preview 3 釋出了,再一次試試它的效能

![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201204232312408-99478373.png) ## 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 試玩報告](https://www.cnblogs.com/dino623/p/Get-started-with-WinUI-3-for-desktop-apps.html)》提到 Preview 1 的開發體驗和效能都未能令人滿意。這次改進了開發體驗,雖然還是沒有設計檢視,但智慧感知、實時視覺化樹、熱過載等功能已經可以讓人在 Visual Studio 上進行 WinUI 3 的開發(以前都是在 UWP 專案中寫好再複製到 WinUI 專案)。 下面 WinUI 3 公開的路線圖,從這圖可以看出 WinUI 3 Preview 3 在功能上已經和正式版十分接近,恐怕正式版不會再新增很多值得玩的新功能,所以如果要嚐嚐鮮的話現在正適合。 ![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201204232323009-1003660378.png) ## 3. 試玩 WinUI 3 Preview 3 要試玩 Preview 3,你需要具備以下條件和環境: - 確保你的開發計算機上已安裝 Windows 10 版本 1803(內部版本 17134)或更高版本。 - 安裝 [Visual Studio 2019 版本 16.9 預覽版](https://visualstudio.microsoft.com/zh-hans/vs/preview/) - 安裝 Visual Studio 時包含以下工作負載: - .NET 桌面開發(這也將安裝 .NET 5) - 通用 Windows 平臺開發 - 安裝 [WinUI 3 預覽版 3 VSIX 包](https://marketplace.visualstudio.com/items?itemName=Microsoft-WinUI.WinUIProjectTemplates) - 愛與勇氣與希望 安裝完所有東西后,下一步要做的和[上次](https://www.cnblogs.com/dino623/p/Get-started-with-WinUI-3-for-desktop-apps.html)沒什麼區別,在新建專案的介面裡選擇 C# 的 “Blank App, Packaged (WinUI in Desktop)” 專案,並選擇對應的 Windows 平臺建立專案。 ![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201214084351882-416012509.png) 再下一步,你就需要拿出你的愛與勇氣與希望,去網上與其他微軟粉絲交流怎麼編譯這個剛剛建立一行程式碼都沒改過就報錯的全新的 WinUI 3 專案: [Cannot build WinUI3 Preview3 desktop package project in fresh installed VS #3635](https://github.com/microsoft/microsoft-ui-xaml/issues/3635) [Why do you waste dev's time with unusable releases ? #3645](https://github.com/microsoft/microsoft-ui-xaml/issues/3645) 有些人第一次就能編譯通過並執行,那真是太令人高興了, 已經沒什麼好害怕的了,奇蹟、魔法,都是存在的。 ## 4. 效能改進? 經過了一段痛苦和掙扎,我終於可以執行 WinUI 3 Preview 3 了。 現在制約我將來使用 WinUI 3 的要素只剩下開發體驗和效能。開發體驗方面應該不用太擔心,將來 WinUI 3 正式版的開發體驗至少不會比 UWP 差(UWP 都忍過來了,已經沒有什們能難到我了)。另一個我比較在意的地方是效能表現,這方面還是個未知數。本來我還期待 WinUI 3 的效能只比 UWP 差一點點,可是 Preview 1 的實際表現讓人大跌眼鏡,所以在這個預覽版特地提到效能改進讓我很期待,於是我再次測試了它的效能。首先用和 《[WinUI 3 試玩報告](https://www.cnblogs.com/dino623/p/Get-started-with-WinUI-3-for-desktop-apps.html)》同樣的程式碼在 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 好。可是這樣還遠遠不夠好,於是我又試了另一種測試。這次我找到最近寫的 《[使用離散式關鍵幀播放動畫](https://www.cnblogs.com/dino623/p/using_DiscreteDoubleKeyFrame_to_play_animation.html)》裡的散步貓動畫。在這個測試中,WPF 和 WinUI/UWP 的 Xaml 部分完全一樣,只是動畫的程式碼部分稍微有些出入: ``` CS // 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 執行起來有閃爍的現象: ![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201208223202442-937355541.gif) ## 5. 結論 WinUI 3 Preview 3 功能、效能、開發體驗等各方面都有所提升,尤其效能上某些情況下可以達到 UWP 的水平,但仍有奇怪的問題。總的來說,目前 XAML 平臺各有各的問題,沒一個能打的。不過 XAML 仍是我最好的朋友,期待下一個版本的 WinUI 能給我驚喜。 最後,微軟更新了 WinUI 3 的 Release Roadmap,修改了 WinUI 3 的釋出計劃。希望正式版快些到來吧,不然 MAUI 要加入戰局了。 ![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201204232342587-366526518.jpg) ## 6. 參考 Announcing WinUI 3 Preview 3! ✨