1. WinUI 3
在微軟 Build 2020 開發者大會上,WinUI 團隊宣佈可公開預覽的 WinUI 3 Preview 1,它讓開發人員能夠在 Win32 中使用 WinUI。最終 XAML 的新功能再也不和 Windows SDK 綁定,全部新的 XAML 功能都將做爲 WinUI 的一部分發布。 做爲 OS 的一部分發布的現有 UWP XAML API 將不會再收到新的功能更新。 可是,它們會在 Windows 10 支持生命週期內繼續收到安全更新和關鍵修復程序。html
2. WinUI 3 第三個預覽版
微軟在上個月(11 月)發佈了 WinUI 3 Preview 3,具體新增的特性和功能能夠看文章最後給出的參考連接。這裏我列出我比較重視的新特性:git
- ARM64 支持
- 對工具/開發人員的改進:
- 實時可視化樹, 熱重載,實時屬性資源管理器及相似工具
- Intellisense 現適用於 WinUI 3
- MRT 核心支持
- 這可以使應用在啓動時速度更快、更輕質,還能加快資源查找速度。
- 性能改進
這些都是預期以內的改進。在我半年前寫的文章《WinUI 3 試玩報告》提到 Preview 1 的開發體驗和性能都未能使人滿意。此次改進了開發體驗,雖然仍是沒有設計視圖,但智能感知、實時可視化樹、熱重載等功能已經可讓人在 Visual Studio 上進行 WinUI 3 的開發(之前都是在 UWP 項目中寫好再複製到 WinUI 項目)。github
下面 WinUI 3 公開的路線圖,從這圖能夠看出 WinUI 3 Preview 3 在功能上已經和正式版十分接近,恐怕正式版不會再添加不少值得玩的新功能,因此若是要嚐嚐鮮的話如今正適合。windows
3. 試玩 WinUI 3 Preview 3
要試玩 Preview 3,你須要具有如下條件和環境:安全
- 確保你的開發計算機上已安裝 Windows 10 版本 1803(內部版本 17134)或更高版本。
- 安裝 Visual Studio 2019 版本 16.9 預覽版
- 安裝 Visual Studio 時包含如下工做負載:
- .NET 桌面開發(這也將安裝 .NET 5)
- 通用 Windows 平臺開發
- 安裝 WinUI 3 預覽版 3 VSIX 包
- 愛與勇氣與但願
安裝完全部東西后,下一步要作的和上次沒什麼區別,在新建項目的界面裏選擇 C# 的 「Blank App, Packaged (WinUI in Desktop)」 項目,並選擇對應的 Windows 平臺建立項目。app
再下一步,你就須要拿出你的愛與勇氣與但願,去網上與其餘微軟粉絲交流怎麼編譯這個剛剛建立一行代碼都沒改過就報錯的全新的 WinUI 3 項目:ide
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.八、.Net 五、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!:
<https://github.com/microsoft/microsoft-ui-xaml/issues/3620>;
Windows UI 庫 3 預覽版 3(2020 年 11 月):
<https://docs.microsoft.com/zh-cn/windows/apps/winui/winui3/?WT.mc_id=WD-MVP-5003763>;
Windows UI Library Roadmap :
<https://github.com/microsoft/microsoft-ui-xaml/blob/master/docs/roadmap.md#winui-30-feature-roadmap>;
7. 測試代碼
<https://github.com/DinoChan/WinUI_Preview3_Performance_Test>;