当前位置: 首页 > news >正文

我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi

目录

NET Framework 4.6.2的最大亮点

为什么固守462不升级

WPF-开发体验的巅峰

为什么对WPF动摇了

基于Islands+UWP的滤镜尝试

总结


NET Framework 4.6.2的最大亮点

安全性能大提升:

默认启用TLS1.2协议,更安全,它为后续的版本提供了重要的安全支撑,是微软在网络安全方面的重要里程碑

一般现代的浏览器和服务器都优先使用TLS1.2,这也是嵌入webview2的重要基础。

兼容性增强 :

更好的windows10支持(非常重要,对更好地使用win10的UI特性提供了可能)


为什么固守462不升级

多年的Windows窗口程序的开发经验,使用的 .NET Framework版本 ,从2.0,到3.5,到4.0,到4.5.1,到4.6.2 ,虽然微软一直在提倡 6.0,8.0,甚至9.0,现在已经推出了 10.0,它们拥有更好的特性和性能,但是我个人使用最多的其实是4.0~4.6,在大量的企业项目的实践中,4.0表现出了绝对的兼容性和稳定性的优势,尤其是在兼容性上。因为每次进行微小的框架升级后,都可能在某个特别的场景中遇到灵异事件,这种埋雷很让人头疼,所以在较长的周期来看,从依赖的硬件接口、对各类sdk的兼容、用户的安装环境 等各方面考虑,徘徊在新旧的框架之间,既想使用新的特性,又担心稳定性和兼容性受到影响。综合考虑,当前主要在使用4.6.2。


WPF-开发体验的巅峰

接触Winform/Asp.net/WPF/UWP/Winui3/HTML开发,在这些体验中,WPF绝对是开发体验最优,且难以被超越的一种前端框架,WPF可用的免费UI库也非常丰富:

Modern UI 框架:

HelixToolkit.Wpf 框架:

XamlFlair 框架:

XAML可读性极强,数据双向绑定,丰富的矢量图形支持、多种多样的动画系统、完全自定义的UI外观(真的太自由了)、任意的ui元素(包括视频)对外部着色器的支持也仅仅是简单的几句代码就搞定、任意的UI元素可以以任意的路径裁切展示(UWP和WinUI3实现相同功能极其复杂,甚至很难支持)且方式简单、各种路径形式的透明过渡使用起来也极其轻松(比如透明羽化,OpacityMask轻松解决,但是UWP甚至无法直接支持)、透明窗口的使用方式和兼容性也极强(几乎没看到过在哪里黑窗口的情况,但是WINUI3要绕一大圈才能实现,而且对不同的Windows系统版本的兼容性也不同),因此,当习惯了WPF开发以后, 再去适应其他的UI框架, 会感觉到处是坑。


为什么对WPF动摇了

这里提到的“动摇”是有条件的:如果对于偏功能性的企业级的应用,WPF 绝对是极佳的选择, 但是当应用偏向于交互和展示的时候,希望给用户以更好的UI操作体验的时候,WPF的动画帧率就严重的不能满足视觉需求了.

 WPF 动画效果:

UWP + CompositionApi 动画效果:

(上面2个演示,为了极致的表现出2个动画的差异,我使用了佳能相机对电脑屏幕以 60FPS 录制了视频, 视频原文件在文末的附件中)

从上面的示例可以看到, 假设让一张全屏的图片 从右侧 切入到主屏来显示, WPF会有一种大步迈进的、咯噔咯噔的感觉(我觉得很像是汽车在过减速带的感觉),这种感觉显得很吃力、不优雅,无法表达出 “轻松拿捏的高级感”,这个时候,就会动摇:选择WPF是否是一个正确的选择呢? 可是如果升级更高的框架来适应其他的UI框架的话,有可能在硬件的对接、系统的兼容性上,在实施部署阶段遇到问题的可能性极大,在这种条件下,采取了方案:保留了基于.NET Framework 4.6.2的业务处理, 以及部分功能性的管理页面,而对于侧重用户交互的流程部分, 通过Islands嵌入的方式来使用 UWP的功能,类似于WindowsFormsHost嵌入Winform控件,这里通过XamlHost 嵌入UWP控件,通过这种方式 在进行 比较大量的图片列表滚动的时候,视觉效果差异极大。

UWP在使用的时候几乎不用去担心内存管理,使用很随心,并且极流畅,WPF 在进行对象管理的时候, 尤其是大量对象、大量图片的管理上,极容易让内存持续飙高,这对于即使有经验的开发者来说,进行有效的管理也是一件不容易的事(这种场景下,我验证多种方式来看,最轻松有效的方式是使用弱对象管理 WeakRefrense,根据使用效果看,目前基本没有遇到弊端)。


基于Islands+UWP的滤镜尝试

WPF实现滤镜是相当简单的一件事,并且对任意UI元素有效,包括视频:

但是当前Islands+UWP这种嵌入方式, 其实对UWP本身的功能进行了很多限制,而且UWP本身就是基于 沙盒机制,虽然很安全,但是很多效果无法使用,因此,当我们要实现一个多种多样的滤镜功能的时候,与WPF比起来, 是相当困难的一件事。

其实在采取 WPF+Islands+UWP 这个方案之前我尝试过:

尝试 1:.net6.0 +wpf+嵌入winui3 = >但是wpf本身基于directx9, 但是winui3基于directx11,12 , 它们可能有渲染上有资源竞争或冲突,导致嵌入后总是莫名其妙地突然崩溃退出;

尝试 2:.net6.0 +winform+嵌入winui3 = >可行。Winform本身是gdi+的渲染机制, 与winui3的directx11,12不冲突 ,可以成功嵌入,但是没有深入研究这种嵌入状态的其他组件的健壮性, 该组合属于不上不下的状态。

尝试 3:.net8.0+纯winui3=>可行,而且配合ai很轻松地写出了几十种滤镜,但是在 这种组合下,我去尝试使用 透明窗口和 元素的异形裁切的时候,遇到了很多坑,远没有想象的顺利。所以虽然这种方案具有极好的性能,但是它表现出来的问题,以及它复杂的使用方式,让我对迁移到跨度这么大的框架,并没有信心和把握。

尝试 4:.net 4.6.2+webview2=>这与当前的框架选择差异是比较大的, 它是偏web化的一种实现方式, Web具有非常好的开发生态, 而且这种组合表现出了良好的渲染性能 ;但是我在实际验证的时候也遇到了一些问题,比如在对接工业相机的时候,对于实时帧的显示,性能是极差的, 而且这个迁移的差异太大,工作量极大。但是它极强的 渲染能力和极佳的开发生态,对我有非常大的吸引力,我后续可能会考虑。

以上的 4 种尝试,都让我对框架的升级没有信心,它们目前的稳定性或成熟度,也对我没有足够的吸引力,因此暂时先保留了当前的4.6.2+ Islands+UWP的使用方式

UWP 的这种 Islands 嵌入的方式使我对着色器的使用并不能特别的自由,因此只能使用纯cpu的 滤镜算法,但是这不适合实时视频帧的应用 :

上图是我在另一篇文章中实现的滤镜效果:

https://blog.csdn.net/LateFrames/article/details/150536630?spm=1001.2014.3001.5501


总结

如果想要安全的、具有极丰富的可扩展性、并且高效率的开发,那么 WPF 无疑是绝对的最佳的选择 ;如果在旧项目 需要进行迁移, 但是考虑到综合硬件原因, 不能对框架升级太多的时候,但是又对 UI 的体验有进一步的要求, 这时候可以考虑嵌入 Islands 方式来使用 UWP 组件, 它就像在 WPF 中嵌入了一个 WinForm 组件  WindowsFormsHost 的感觉 ,但是这种方式的局限性也非常大, 很难使用着色器, 开发体验也比较差, 这种嵌入的方式无法可视化编辑,这一点在效率上来说很低, 但是 UWP+CompositionApi 的动画流畅性太棒了,这是 WPF 如何都无法达到的流畅帧率 。

WPF动画与UWP动画比对的相机录制视频的原文件,可以更清晰地看到视觉效果的差异,附件:

WPF:https://download.csdn.net/download/LateFrames/91949307

UWP:https://download.csdn.net/download/LateFrames/91949310


文章转载自:

http://coYY0OYO.kntsd.cn
http://FwgNnFWw.kntsd.cn
http://txvQFkSw.kntsd.cn
http://36ZMPEpW.kntsd.cn
http://mInqE4zf.kntsd.cn
http://vgLryQSp.kntsd.cn
http://B8aOKzS8.kntsd.cn
http://L7wyH2lV.kntsd.cn
http://SfBu4LI6.kntsd.cn
http://uBSV7njI.kntsd.cn
http://r8NVl3C9.kntsd.cn
http://JE55C1wo.kntsd.cn
http://LwNjjc20.kntsd.cn
http://RUDLsGuz.kntsd.cn
http://LAtfdNdr.kntsd.cn
http://Dqic2d2E.kntsd.cn
http://Gm5C5TND.kntsd.cn
http://7Ko0otBr.kntsd.cn
http://vLmsuiUt.kntsd.cn
http://21E1fdGW.kntsd.cn
http://q827ZvvY.kntsd.cn
http://udN8XxfR.kntsd.cn
http://SLzeW6kG.kntsd.cn
http://9BgW3OB3.kntsd.cn
http://CA06qthx.kntsd.cn
http://BDhmhgcE.kntsd.cn
http://4QiHGRYP.kntsd.cn
http://avIkqINf.kntsd.cn
http://mAyeXDAt.kntsd.cn
http://xdVSR2Lv.kntsd.cn
http://www.dtcms.com/a/386204.html

相关文章:

  • 1.整流-滤波电路的缺点和PFC的引入
  • QT 项目 线程信号切换 举例
  • 构网型5MW中压储能变流升压一体机技术方案
  • 【数据工程】8. SQL 入门教程
  • C++---前向声明
  • 在Qt项目中使用QtConcurrent::run,实现异步等待和同步调用
  • 经验分享只靠口头传递会带来哪些问题
  • Linux底层-内核数据接口:/proc
  • PEFT+DeepSpeed 1 (微调 分布式 显存优化)
  • Spring Boot 下 Druid 连接池:多维度优化打造卓越性能
  • 提升学术研究能力:从开题构思难题到AI辅助提纲生成
  • spring-kafka的消息拦截器RecordInterceptor
  • VSCode + Python 开发踩坑:虚拟环境不在项目根目录导致包无法识别该怎么办
  • 【MCP】【FastMCP】[特殊字符] 使用 UV 创建 FastMCP 服务完整示例
  • 蓝绿部署(Blue-Green Deployment)介绍(一种用于降低软件发布风险的部署策略)流量切换(金丝雀发布)
  • 羽毛球地板:从专业运动场景到全民健身市场的技术跃迁与产业重构
  • 【实战】预警算法--噪声添加机制
  • Three.js 中如何给 3D 模型添加文字标签?
  • 贪心算法应用:NFV功能部署问题详解
  • 第八章:Jmeter 非GUl命令详解
  • 知识点17:多Agent系统架构设计模式
  • 作为学术工作者,利用沁言学术提升效率:集成化与一站式体验
  • Linux网络设备驱动—netlink
  • C# 导出 Excel 时并行处理数据:10 万条数据分批次并行转换,导出时间缩短 60%
  • 设计模式(java实现)----原型模式
  • VBA 将多个相同格式EXCEL中内容汇总到一个EXCEL文件中去
  • Android系统基础:底层状态监听UEvent之UEventObserver源码分析
  • windows 平台下 ffmpeg 硬件编解码环境查看
  • 构建基石:Transformer架构
  • Chapter7—建造者模式