WinUI 3试玩报告
1. 什么是 WinUI 3
在微软 Build 2020 开发者大会上,WinUI 团队宣布可公开预览的 WinUI 3 Preview 1,它让开发人员可以在 Win32 中使用 WinUI。WinUI 3 Preview 1 包含新的 VisualStudio 项目模板,可以创建面向 .NET 5 的 C# 和 C++/Win32 项目。从技术上讲,WinUI 3 将 UWP 的 XAML、Composition 和 Input 层分离,并通过NuGet将它们独立分发给针对Windows 10 版本 1803 及更高版本的 Win32 应用。
WinUI 3 适用于 Win32 和 UWP,这篇文章主要讨论 Win32 的情况。
2. 理解 WinUI 3
以前我们总是抱怨 WPF 多年都不提供新的主题,不提供新的控件,性能又没提升。现在微软索性把什么都是新的 WinUI 3 提供给桌面开发,没 WPF 什么事了。
简单来说,UWP 的开发体验不好(关于这个话题真是一言难尽),而且出了 Bug 还必须等待下半年的 Windows 更新进行修复,但微软的开发人员专心给 UWP 的 UI 层加各种功能;.NET Core 更新很快,但很少人有兴趣有动力给陈旧的 WPF 的 UI 层进行大幅度的改进。于是 WinUI 将 UWP 的 UI 层从 Windows SDK 的其它部分分离,并将从 Windows 转移到 Nuget。现在建一个 C++ 或 C#(.NET 5) 程序,再从 Nuget 上装个 WinUI 3 的包套个 UI 层,一个基于 Fluent Design,触摸友好,性能无与伦比的应用程序就诞生了。
上图列举了 WinUI 3 和其他平台对比的部分特性,除此之外 WinUI 3 还有很多好处,例如开源、更新更快、更新不与系统版本绑定等,更详细的内容还是看微软自己怎么宣传吧:
WinUI - The modern native UI platform of Windows.
不过要用上 WinUI 3 还要等一年半载。下面是微软给出的发布路线图,目前我们也只能用 Preview 版尝尝鲜。
3. 试玩WinUI 3
要试玩 WinUI 3 首先要有 Windows 10 1803 以上版本的电脑(WinUI 3 最低支持1803),然后还需要使用 Visual Studio 2019 16.7 以上版本(目前只能安装预览版)。安装 Visual Studio 时要把以下工作负载全都选上:
- .NET 桌面开发
- 通用 Windows 平台开发
- 使用 C++ 的桌面开发
- 适用于通用 Windows 平台负载的 C++(V142) 通用 Windows 平台工具可选组件
当然 .NET 5.0 也要装上。
然后在 https://aka.ms/winui3/previewdownload 下载并安装 WinUI 3 Project Templates 扩展,这样才可以在 Visual Studio 创建 WinUI 的项目。
可选 C++ 或 C# ,这里我选择了 C# 的“Blank App, Packaged
(WinUI in Desktop)”项目,并选择了对应的 Windows 平台:
项目创建后 Visual Studio 生成了两个项目。第一个包含应用的代码,代码结构基本和 UWP 一样,只是少了用于打包应用的 Package.appxmanifest 和一些图片。从依赖项里可以看到项目已经安装了 Microsoft.WinUI 3 的包。从项目属性里可以看到这就是个 .NET 5 的项目。
Visual Studio 生成的第二个项目是一个 Windows 应用程序打包项目,该项目经配置后可将应用生成为适合部署的 MSIX 程序包。 也就是说 UWP 项目中用于打包的部分被独立出来了。这个项目还应该是解决方案的启动项目。运行这个项目后创建的应用会添加到开始菜单中,这点也和UWP一样。
到这里为止都和预期的一样,我之后还尝试了将 UWP 应用移植到 WinUI ,基本上只需要将 Windows.UI
命名空间改为 Microsoft.UI
就可以了,XAML 和 C# 代码完全不用变。只可惜目前 WinUI 还很简陋,Win2D、Community Toolkit 等微软自己发布的 UWP 包都还没有 WinUI 版本。而且没有设计视图,XAML 视图也没有智能感知,现在想要用 WinUI做些什么有趣的项目会很困难。不过从目前的移植难度上来看,将来正式发布后应该可以完整地将 UWP 的 UI 的开发经验运用在 WinUI 上。
4. 和 WPF 及 UWP 进行对比
既然 WinUI 3 开发模式和 WPF 及 UWP 都很像,我当然对它们之间的对比很感兴趣。
命名
首先说说命名,“WinUI” 光这个名字就 Win 了。 “UWP” 太高雅,我敢打赌国内有些 UWP 的开发(例如我)都不能好好地把 UWP 的全称拼出来;“WPF” 好些,但 WPF 的含义也让人很疑惑。而 Windows UI 简称 WinUI ,意义和发音都很清晰明确。不过这三个都比很多人都不会读的 “Xamarin” 强多了。
可是有了 WinUI 3 ,就会有人问“那 WinUI 2 呢?”WinUI 2是一个 UWP 的控件库,当然的只能用在 UWP 上。这就很尴尬了,WinUI 的 3 和 2 根本不是同一个概念,实在很容易让人混淆,说不定以后会把后缀的 3
去掉(我这篇文章就常常懒得理写个3
)。而且 WinUI 2 中代码的命名空间以 Windows.UI
开头,在 WinUI 3 中变成 Microsoft.UI
,按着 Office 365 改名为 Microsoft 365、Bind Ads 改名为 Microsoft Advertising 这些经验,该不会以后 WinUI 可能改名为 Microsoft UI ,简称 MiUI 吧?
权限
权限方面是 WinUI 的一个亮点,因为它本质上就是个 Win32 程序,可以放开手脚随便来。相对的 UWP 有很严格的权限限制,开发 UWP 时常常会感到绑手绑脚。例如下面这段代码,大部分 WPF 开发者都难以想象只是最小化 UWP 程序而已,它就不能好好运行了:
int count = 0;
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += (s, e) =>
{
myButton.Content = count++;
};
timer.Start();
UWP 的生命周期如上图,当 UWP 处于 background 运行或 suspended 状态时应用基本处于暂停状态,也也不会处理UI功能。我明白这是 UWP 为了省电、安全等原因才这样设计,但对开发人员来说真的太不方便。而 WinUI 应用基本上就是个 Win32 应用,目前看来不会有这些坑。
开发体验
说起开发体验,WPF 好歹还算正常,Visual Studio 的设计视图运行正常,编译起来也快。UWP 编译很慢,设计视图经常出问题,Blend 也时好时坏把设计师都气跑了。就算完全按着官方的文档完成一个 UWP App,甚至一行代码都不改,发布到商店后还是有可能崩溃。而对于应用商店,真是千言万语汇聚成一个草花头。
现在 WinUI 的 XAML 视图连智能感知都没有,也没有设计视图,实在没法谈开发体验。很难猜测正式发布的时候会怎么样,希望至少和WPF保持一致吧。
性能
WPF 总是给人“慢”的印象,除了因为在它刚出来的时候(10年前)电脑性能不够导致留下了刻板印象,还有一个主要原因是:它真的很慢。
UWP 的 XAML 有很优秀的性能表现,除此之外为了照顾已经不存在的 Windows Phone 的贫弱性能,很多控件模版都经过精心设计并大幅简化。
为了验证 WinUI 的性能我写了下面这些代码,然后分别移植到 WPF .Net Framework 4.8、WPF .NET 5、UWP、WinUI(WPF 和 UWP/WinUI 的代码稍微有一点不同):
for (int i = 0; i < 50; i++)
{
var rectangle = new Rectangle
{
Height = 500,
Width = 500,
Opacity = ((double)i + 40) / 100d,
RadiusX = 108,
RadiusY = 98,
StrokeThickness = 3,
Stroke = new SolidColorBrush(Color.FromArgb(255, 75, 75, (byte)(i * 250d / 50d))),
RenderTransformOrigin = new Point(0.5, 0.5)
};
Root.Children.Add(rectangle);
var angle = i * 360d / 50d;
var transform = new RotateTransform
{
Angle = angle
};
rectangle.RenderTransform = transform;
var storyboard = new Storyboard();
storyboard.Children.Add(new DoubleAnimation { Duration = TimeSpan.FromSeconds(1), From = angle, To = angle + 360 });
Storyboard.SetTarget(storyboard, transform);
Storyboard.SetTargetProperty(storyboard, "Angle");
storyboard.RepeatBehavior = RepeatBehavior.Forever;
storyboard.Begin();
}
上面这段代码是让50个矩形旋转,十分考验 WPF 的性能。结果可以说出乎意料。
CPU | 内存 | GPU | |
---|---|---|---|
WPF .NET Framework 4.8 | 12 | 60 | 76 |
WPF .NET 5.0 | 12 | 85 | 72 |
UWP | 3 | 28 | 36 |
WinUI | 5 | 65 | 95 |
我的环境是 i7-6820HQ 及集成显卡。WPF 平台占用 70 多%的 GPU,这我大致能猜到。UWP 十分流畅,GPU 只占用 WPF 的一半,CPU 和 内存都有出色表现,不过我还以为会更低的。
WinUI 这个浓眉大眼的我真的万万没想到,不仅掉帧明显,还占用了几乎 100% GPU,也就是说它连这么简单的代码都跑不起来。()顺便一提,将测试代码中旋转的矩形减少为10个,WPF 的程序占用 32% GPU,而 WinUI 占用 70 多%。)
从上面的数据基本可以说明,WinUI 离设计目标还十分遥远,毕竟是预览版,还有一年半载可以慢慢优化。
5. 结语
总的来说微软雄心勃勃,可是现在拿出来的 WinUI 预览版还差得太远,功能未完善,性能不及预期。我觉得大致方向没错,WinUI 对 C++、WPF、UWP 开发者都是个新的工具新的机遇,可以关注一下。
6. Q & A
Windows 7 怎么办?
按微软公布的路线图,再包括跳票等因素,等 WinUI 真正可用时 Windows 7 已停止更新很久,到时 Windows 7 的占有率可能已经下降到开发者不会关心的程度。
基于 .NET Core 的 Wpf 还是 WinUI?
假使不想花精力将现有项目迁移到 WinUI,或者对来自 UWP 的 WinUI 没信心,又或者舍不得 Windows 7 的用户,并且对触摸没需求,当然可以继续选用 WPF,基于 .NET Core 的 WPF 会是个很好的选择。
MAUI 还是 WinUI ?
MAUI 还在很遥远的将来(2021年11月),我没试玩过,所以不好评价。如果有跨平台需求当然只能选 MAUI,如果 WinUI 团队技高一筹实现了 MAUI 难以企及的超高性能,那就选 WinUI。不过 MAUI 这个名字太过普通/普遍,可能会被逼着改名吧。
那 UWP 呢?
权限受限的 UWP 可以说是人畜无害,对用户来说可能也是个不错的选择。而且 UWP 还支持 Xbox 和 Hololens 等平台,目前看来还是有它的市场。
Winform 呢?
人只有忘却了过去,才能好好活着。
WinUI 有未来吗?
我做了好多年 Silverlight 开发,买了5、6部 Windows Phone 手机,写了几十篇 UWP 文章,根据我丰富的经验,我可以肯定 WinUI 是有未来的。
8. 参考
WinUI - The modern native UI platform of Windows.
Introducing WinUI 3 Preview 1 - Windows Developer Blog
Get started with WinUI 3 for desktop apps Microsoft Docs
GitHub - microsoft_microsoft-ui-xaml
WinUI 3.0_ The future of Windows controls
WinUI 3试玩报告的更多相关文章
- HTML5+JS 《五子飞》游戏实现(七)游戏试玩
前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...
- 一个小玩意 PHP实现微信红包金额拆分试玩
<meta charset="utf-8"> <?php // 新年红包金额拆分试玩 class CBonus { public $bonus;//红包 publ ...
- 1.2G内存试玩RAMOS_XP
1.2G内存试玩RAMOS_XP1.为了防止做系统时出现意外,用Bootice把C盘MBR修改为Grub4dos,这样子系统如果失败,可以进入PE重做. 2.进入PE格式化C盘,格式化的时候勾选启用N ...
- 8个经典的HTML5游戏在线试玩及源码学习
原文地址:http://www.oschina.net/news/32364/html5-games 游戏,毫无疑问是拿来供大家娱乐玩耍的,这也无可厚非,但是,今天给大家分享的8个HTML5游戏,在好 ...
- Apollo框架试玩
2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...
- 发布到FaceBook试玩广告,FaceBook要求要一个Html文件
Facebook 试玩广告具体要求: 试玩广告参数是创建试玩广告素材时要满足的要求. 试玩素材应为 HTML5 格式. 试玩广告素材不应使用 mraid.js 格式. 包含所有素材的试玩广告的单个 H ...
- [试玩] FMXLinux (Firemonkey for Linux) Linux 桌面开发(第三方插件)
FMXLinux 是一个可以用来开发 Linux 桌面软件的第三方插件,它需要配合 Delphi 10.2 Toyko 官网:http://www.fmxlinux.com/ 使用方法:开启 FMX ...
- ESP32 LyraT音频开发板试玩(二):播放音乐
我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 本文延续上一篇博客 将D:\msys32\ ...
- ESP32 LyraT音频开发板试玩(一):搭建开发环境
我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 关于ESP32的开发环境搭建,官方有教程, ...
随机推荐
- 黑马程序员_毕向东_Java基础视频教程——进制转换之负数二进制(随笔)
进制转换之负数二进制 负数的二进制表现形式 6 = 110 -6 : 其实就是 6 的二进制取反再 + 1 一个整数在内存中是占 4 个字节 **取反:将二进制里的 1 变成 0,0 变成 1. 以6 ...
- (Python基础教程之八)Python中的list操作
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- myeclipse 2017 CI 破解
1.首先下载破解文件(破解前先关闭myeclipse),链接:https://pan.baidu.com/s/1CPFH4Nga3xITSyj-BCVeaw 提取码:mkvz 2.将下载的破解文件解压 ...
- 【python接口自动化】- openpyxl读取excel数据
前言:目前我们进行测试时用于存储测试数据的软件几乎都是excel,excel方便存储和管理数据,读取数据时也比较清晰,测试时我们需要从excel从读取测试数据,结束后还需把测试结果写入到excel中, ...
- express+mysql实现简单的登录功能
登录页面图: node.js文件代码: const express=require("express"); const app=express(); const path=requ ...
- 5.2 Go 包与函数
5.2 Go 包与函数 在多个包中相互调用函数,需要用到Go包的知识. 代码组织如下: 思路: 1.定义功能函数calc放入到utils.go,将utils.go放在utils文件夹/包中,当其他文件 ...
- Django之url反向解析
在urls.py文件中,在进行url映射时,为请求的url命个名,以便在模板页面或者views.py视图中可以进行反向解析,同时在修改了url映射的请求路径,名称不变的情况下,不再修改模板页面或者视图 ...
- 05.django 搜索与过滤
django-filter https://github.com/carltongibson/django-filter https://django-filter.readthedocs.io/en ...
- rasdaman介绍及安装
一.分布式介绍 Rasdaman中的主节点称为Rasdaman的主机,它充当中央Rasdaman请求分派器并且控制所有服务器进程.Rasdaman管理器接收客户机请求并将这些请求分配给服务器进程.服务 ...
- redis学习——day01_redis简介与安装
一.Redis 简介 1.1 Redis是什么 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redi ...