CS架构

Web具有非常强大且友好的开发生态,在CS架构的窗口程序中嵌入浏览器,有哪些好处呢?

1,能够极大丰富程序的表现形式

2,能够充分地利用web的跨平台特性

3,能够使用web更现代更丰富的UI表现形式

4,网页可以更好的利用 系统功能。

那么非常关键的一点是,如何让嵌入浏览器的表现尽量地接近原生浏览器呢?

本文对谷歌原生浏览器、和在C#中 4 种方式嵌入浏览器,一共 5 种方式,进行兼容性、性能、和高级特性 三大方面的表现来进行比对。


主机参数

测试主机的参数如下:

处理器    Intel(R) Core(TM) i9-14900HX   2.20 GHz

机带 RAM    32.0 GB (31.7 GB 可用) 

系统类型    64 位操作系统, 基于 x64 的处理器 

笔和触控    没有可用于此显示器的笔或触控输入

版本    Windows 11 家庭中文版

版本号    24H2 

操作系统版本    26100.3775 

体验    Windows 功能体验包 1000.26100.66.0


5 种方式

5 种方式使用浏览器,分别为:

  1. 谷歌原生浏览器,版本:127.0.6533.73(正式版本)

  2. WinUI3 + WebView2,框架:.NET 8.0

  3. WPF + WebView2,框架:NET462

Nuget包:Microsoft.Web.WebView2 (版本:1.0.3240.44)

  1. WPF + ChromiumWebBrowser,框架:NET462

Nuget包:CefSharp.Wpf(版本:135.0.220)

  1. WPF + WebBrowser,框架:NET462

接下来,详细介绍不同的测试表现。


测试:兼容性 - 标准支持

HTML5标准支持测试(https://html5test.com/),打开网页后,会显示浏览器的评分,总分:555

5 个浏览器的表现:

毫无疑问:谷歌浏览器无疑是兼容性最好的

有点意外:WPF+ChromiumWebBrowser 评分竟然与谷歌相同,有点对Cef 刮目相看了

意料之中:WinUI3+WebView2和WPF+WebView2 表现一致,都略逊于谷歌原生浏览器;

波澜不惊:WPF+WebBrowser作为被淘汰的浏览器,一如既往地让人失望,这评分我都喜出望外

结论:从 “HTML5标准支持测试” 单项标准看,除了 WPF+WebBrowser这种古老的方式,其他基本都安全可用


测试:兼容性- 百度新闻

百度新闻(https://www.baidu.com/)

作为最常见的综合性网页,前4种都能正确地打开、查看网页内容,但是在窗口加载时有些细微的差异:

毫无疑问:谷歌浏览器是反应最快的,网页打开的很直接,没有窗口变换效果,网页内容加载时快速闪现了一下白屏;

有点意外:WPF+WebView2弹出的网页,竟然带有透明渐变和跳跃蹦出的窗口变换效果,这很符合Windows系统内置的一些风格,略带“优雅感”

仍然意外:.NET 8.0框架下的WinUI3程序中内置的WebView2,与NET462框架下的WPF+WebView2表现很接近,但是竟然能感觉出来速度略慢一点,很疑惑.NET8.0没有充分发挥出来框架优势吗?NET462下的竟然表现略胜一筹,这有点意外。

更加意外:前面的 “HTML5标准支持测试”中,Cef在WPF+ChromiumWebBrowser表现相当棒,与谷歌原生浏览器持平,但是这里竟然表现有点“糟糕”,竟然会出现黑色闪屏,页面切换时非常明显的卡顿,甚至有掉帧的感觉,页面加载时的白屏也非常的明显,与前面3者相比,简直缓慢和卡顿。

不想提它:WPF+WebBrowser仍然弹框报错,每次出现的报错框熟悉的不能再熟悉了,再多出现几次,我都能手绘出来了,后面对它进行的所有测试都是相同的报错提示。

结论:Cef的WPF+ChromiumWebBrowser出现的闪黑屏,其实对功能的使用并没有什么影响,网页显示速度略微慢点也有限,都是可接受的范围。所以,如果软件业务是偏向于功能性的,那么前 4 者都可用;但是如果软件业务中需要流畅的UI效果,偏向于体验性,那么就要慎重选择Cef了。

附:下图是 WPF+WebBrowser 的经常报错弹框:


测试:兼容性 - 音频

音频(https://webaudioapi.com/samples/)

皆大欢喜:前4者都能正常使用。


测试:性能

对性能的测试,进行了 2 个动画播放的帧率监控测试,

第一个动画是:WebGL/3D图形(https://threejs.org/examples/#webgl_animation_keyframes),

第二个动画是:WebGL 2.0 (https://webglsamples.org/aquarium/aquarium.html),其中分别对动画中进行了2个不同参数的测试,分别测试 30000 条鱼 和 500 条鱼 渲染时的不同表现。


测试:性能 - 单模型动画

动画:WebGL/3D图形(https://threejs.org/examples/#webgl_animation_keyframes)

上图:这是一个3D模型人行走的动画,在页面顶部可以看到页面渲染的帧率范围,下图指标中的数字是帧率范围的上限。

不负众望:前三者的表现一如既往的好;

意料之外:WPF+WebView2的性能表现毫不逊色于谷歌原生浏览器,甚至有略胜一筹的迹象;

十分错愕:Cef的ChromiumWebBrowser竟然只能达到30FPS,虽然是一个视觉流畅的帧率,但是与前三者相比,明显是一个不折不扣的差学生,而且差异竟然如此之大。

结论:从这一组的性能表现来看,前4个对于侧重功能性的应用来说,能够胜任,但是是对于要求高帧率动画、要求更优用户体验的应用来说,我们要谨慎考虑Cef.


测试:性能 - 30000 条鱼

动画:WebGL 2.0(WebGL Aquarium)渲染 30000 条鱼

这个页面的左侧设置了渲染鱼的数量为30000条,左上角显示渲染的实时帧率,5个浏览器的表现如下:

意料之中:谷歌原生浏览器表现一如既往的稳定,高性能;

喜出望外:WPF+WebView2,在如此高强度的渲染压力下,它的表现又一次超过了谷歌原生浏览器,这真的非常让人意外;

不可思议:WinUI3+WebView2 在上面单一模型动画测试中表现出来的帧率属于顶级的,但是对当前的高负荷的渲染压力下,帧率是极差的,这说明它的适用场景是:低压、轻便的环境。

仍然好奇:Cef下的ChromiumWebBrowser,竟然以完全稳定的帧率在运行,不管当前的渲染压力是大是小,都以一个固定的帧率水平均匀发挥,这一特点让它极度适应各类的功能性软件的开发,具有非常好的兼容性和适应性,始终发挥稳定。


测试:性能 - 500 条鱼

动画:WebGL 2.0(WebGL Aquarium)渲染 500 条鱼

这个页面的左侧设置了渲染鱼的数量为 500 条,左上角显示渲染的实时帧率,5个浏览器的表现如下:

意料之中:谷歌原生浏览器表现一如既往的稳定,高性能;

再次惊喜: WPF+WebView2,无论在低强度渲染,还是在高强度渲染,它的表现均超过了原生浏览器,这真的非常让人意外和惊喜;

原来如此:WinUI3+WebView2 在中强度的渲染压力下, 表现也是居中的水平, 完全够用,但是距离顶级的帧率有巨大的差异,这更加地说明了:它的确是非常的适合低压渲染的场景,并且性能的表现具有一定的弹性,即使渲染压力稍微增大一点点,也仍然具有不错的表现。

始终坚守:Cef下的ChromiumWebBrowser 真的是以完全稳定的帧率在渲染,同时我也尝试选择渲染 1 条鱼,它也仍然是稳定的30帧,看来这是它的内部机制,它的目标就是稳定渲染,它的定位就是良好的兼容性、和稳定性。


测试:高级特性

高级css特性(https://keithclark.co.uk/articles/pure-css-parallax-websites/)

打开网页后,点击顶部的Email链接, 弹出邮件发送的页面,5个浏览器的表现分别是:

不负所望:前三个都可以正常跳转到邮件发送页面。

大失所望:Cef+ChromiumWebBrowser 在前面表现出了极好的稳定性和兼容性,但是在这项新特性的测试中,页面却无法正常打开。这说明,它的兼容性和稳定性是同时伴随着守旧的特性。因此,我们的应用中如果具有很多新潮的体验,要慎重选择Cef , 下面是它打开失败时的页面:


总结

整齐最优:整体表现最优的毫无疑问是谷歌原生浏览器。

嵌入最优:嵌入浏览器,表现最优的是 WPF+WebView2(来自 Microsoft.Web.WebView2 )

从以上方面的评测结果来看,基本上可以总结出来 不同的嵌入浏览器的适用场景:

WPF+WebView2:适应所有场景,各方面都表现极好,在开发web应用时,无论是复杂的业务功能,还是绚丽的动画效果,无论是整体的稳定性,还是对新特性的支持,全都表现非常棒,是任何情况下都非常理想的一个选择。

WinUI3+WebView2:仅仅在低强度UI渲染的场景下表现出色,适合开发轻量、便捷、高性能、炫酷的web应用;

WPF+ChromiumWebBrowser:它是一个朴实无华的、稳定发挥的守旧派,如果web应用偏传统,并且以功能性为主,选择它是完全没有问题的。

WPF+WebBrowser:死路一条。

其他的尝试:还尝试了minibink,但是总缺东少西的报错,放弃了。而且在很久之前用过它,它在兼容性上比较差,还会偶尔出现崩溃。因此暂时不考虑它。


经过以上的测试,基本可以根据应用类型,来选择匹配的嵌入浏览器方式了。具体的嵌入使用方式,等待下篇再验证,也有可能会推翻本文对已有结果的好评,毕竟,表现与易用可能是不同的。

谷歌浏览器 与 C# 4种嵌入浏览器 从 兼容性、性能、高级特性 方面的表现比对的更多相关文章

  1. 浏览器发送URL的编码特性

    转载自:http://blog.csdn.net/wangjun_1218/article/details/4330244 浏览器发送URL的编码特性 尽管有很多规范URL的标准,例如RFC 3987 ...

  2. 在WPF中使用CefSharp嵌入浏览器

    日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它是基于Google浏览器的一个组件,我们可以在 ...

  3. php -- 4种嵌入标记

    ----- 001-tags.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv="c ...

  4. 在WPF中使用CefSharp嵌入浏览器(转)

    在WPF中使用CefSharp嵌入浏览器   日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它 ...

  5. JS——三种嵌入页面的方式

    一 行间事件 二 页面script标签嵌入 三 外部引入 <!DOCTYPE html> <html lang="en"> <head> < ...

  6. CSS对浏览器的兼容性(IE和Firefox)技巧整理

    CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下.对于web2.0的过度,请尽量用xhtml格 ...

  7. CSS对浏览器的兼容性常见处理方式小结

    CSS技巧 1.div的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了. 缺点:要控制内 ...

  8. 对浏览器css兼容性的学习理解及问题解决汇总

    一.从浏览器内核的角度 来看,浏览器兼容性问题可分为以下三类: 1. 渲染相关:和样式相关的问题,即体现在布局效果上的问题. 2. 脚本相关:和脚本相关的问题,包括JavaScript和DOM.BOM ...

  9. IE和Firefox浏览器CSS兼容性技巧整理

    转自:http://homepage.yesky.com/185/11484185all.shtml#p11484185 CSS兼容常用技巧(1) 更多精彩相关文章推荐: 各大浏览器 CSS3 和 H ...

  10. JavaScript高级特性-创建对象的九种方式

    1. 对象字面量 通过这种方式创建对象极为简单,将属性名用引号括起来,再将属性名和属性值之间以冒号分隔,各属性名值对之后用逗号隔开,最后一个属性不用逗号隔开,所有的属性名值对用大括号括起来,像这样: ...

随机推荐

  1. .NET原生操作向量数据库实战系列(一):.向量数据库的应用以及与AI结合的畅想

    在当今数据驱动的时代,向量数据库(Vector Database)作为一种新兴的数据库技术,正逐渐成为软件开发领域的重要组成部分.特别是在 .NET 生态系统中,向量数据库的应用为开发者提供了构建智能 ...

  2. nacos(九):sentinel——规则持久化

    接上回,sentinel基本使用我们已经掌握.但是在设置限流规则时,会发现规则都是临时的,一段时间没访问资源或者重启sentinel,规则就会消失.所以,我们需要有一个将规则持久化保存的地方,让规则一 ...

  3. Object类--equals方法--java进阶day05

    1.equals方法 2.equals方法的逻辑 如图,我们发现调用equals方法将两个属性一样的变量进行比较时,返回的还是false 为了了解清楚equals方法的逻辑,我们ctrl 鼠标右键点击 ...

  4. 【Java】字符串常用操作

    字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...

  5. volatile修饰全局变量,可以保证线程并发安全吗?

    今天被人问到volatile能不能保证并发安全? 呵,这能难倒我? 直接上代码: public class ThreadTest { // 使用volatile修饰变量 private static ...

  6. MONyog入门总结

    1.安装步骤 1)安装MONyog_6.6.3.exe文件,步骤如下: 2)停止MONyog服务 3)将MONyog.exe和MONyog-patch.exe文件放到E:\MONyog\bin目录下 ...

  7. Java连接Redis常用操作

    1.去重 package Data; import redis.clients.jedis.Jedis; public class TestRedisUniq { public static Jedi ...

  8. FreeSWITCH中SIP网关(Gateway)操作

    freeswitch是一款简单好用的VOIP开源软交换平台. 以下是一篇关于FreeSWITCH中SIP网关(Gateway)操作的技术指南,基于提供的官方文档内容整理: 一.网关生命周期管理 1. ...

  9. 如何基于 Kestrel 实现 socks5 代理

    前言 之前做了个轮子NZOrz, 本来打算慢慢参照Kestrel和Yarp长久地写着玩 奈何川普上台,关税,订婚案,自身和钱包等等各种乐子层出不穷,无暇慢悠悠地写轮子玩 还有有些盆友也想知道能否直接使 ...

  10. 《Universal Number Posit Arithmetic Generator on FPGA》(一)

    A parameterized Verilog HDL is constructed for each unit which takes posit word size (N) and posit e ...