使用CefSharp在.Net程序中嵌入Chrome浏览器(九)——性能问题
在使用CEF的过程中,我发现了一个现象:WPF版的CEF比Chrome性能要差:一些有动画的地方会掉帧(例如,CSS动画,全屏图片拖动等),视频播放的效果也没有Chrome流畅。
查了一下相关资料,发现CEFSharp.WPF不是直接渲染在控件上的,它的大概流程如下:
- CEFSharp.WPF的ChromiumWebBrowser控件本质上是一个图片
- 而是通过离屏渲染的方式渲染在缓冲区里,
- 绘制完成后,然后将缓冲区的数据传递到InteropBitmap中去
- 将InteropBitmap作为ChromiumWebBrowser的图源更新
这个基本上是类似于WPF的视频播放器的做法:先离屏渲染出图片,在将图片更新到界面。这个做法由于是使用的WPF的原生渲染方案,可以说是WPF的原生控件的,本身是有不少好处的:
- 可以支持透明背景
- 可以在上面叠加其它WPF控件
- 可以支持WPF的变形,动画,裁剪等特效
简单一句话,是可以和WPF程序无缝集成的,如果将WEB界面作为控件嵌入式再方便不过的。
但是,它这个实现是有代价的:
- 离屏渲染本身需要多一层工序,
- 有切换上下文和内存拷贝的开销。
- 更要命的是,貌似目前GPU离线渲染视频效果还不是很好,因此默认还把gpu加速给关了,性能更下降了一截。
另外,InteropBitmap传递图片内存的效率本身就不高,不光吃cpu,还吃内存,网上也有人讨论过。
针对这些问题,有人建议使用WritableBitmap替换InteropBitmap,但貌似作者认为InteropBitmap的效率更好些。我使用过WritableBitmap离屏渲染地图,应该是能做到比当前更好的性能的。
也有人建议使用效率更高的D3DImage(WPF原生支持这个,不过麻烦些),可能作者觉得目前它的这个性能问题不是首要解决的目标吧,也一直没有采纳。
最后说一下解决方法吧,虽然在大部分的情况下,当前的解决方案是能满足我们的需求的,不过如果遇到非要解决的情况下,可以使用下WinFrom版的CEFSharp,通过WinFormHost来集成到WPF程序中去。
WinFrom版的CEFSharp应该是直接渲染的,我试了一下,效率基本上接近Chrome,并且由于他们的基础库是公用的,在WPF程序中WinFrom版和WPF版的CEF是可以并存的,用起来还算方便。
使用CefSharp在.Net程序中嵌入Chrome浏览器(九)——性能问题的更多相关文章
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(二)——参数设置
在实现了.Net程序中嵌入Chrome浏览器后,下一步的个性化操作就是加入一些设置了,在前面的文章中,我们可以看到在使用Chrome控件前,有如下一个操作: var setting = new Cef ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(一)——简介
有的时候,我们需要在程序中嵌入Web浏览器,其实.Net Framework中本身就提供了WebBrowser控件,本身这个是最简单易用的方案,但不知道是什么原因,这个控件在浏览网页的时候有些莫名的卡 ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(十)——独立文件夹部署
CefSharp本身携带了一大堆文件,这些文件默认直接释放在exe文件底下,这种方式本身没有什么问题,但多了一大堆文件后不是很好看.本文这里就介绍一个方法,使得可以将CEF相关的文件部署到独立的文件夹 ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(六)——调试
chrome强大的调试功能令许多开发者爱不释手,在使用cef的时候,我们也可以继承这强大的开发者工具. 集成调试: 我们可以使用如下函数直接使用集成在chrome里的开发者工具 _chrome.Sho ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(四)——启动优化
在实际使用过程中,发现有的客户端会出现chrome加载网页过慢问题,定位后发现很多是因为设置系统代理所致,此时可以通过如下启动参数禁止系统代理. {"proxy-auto-detect&qu ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(七)——右键菜单
一个常用的功能就是禁止浏览器本身的右键菜单,靠在WPF中拦截鼠标事件是不行的,可以通过设置MenuHandler来实现. 首先实现一个IContextMenuHandler. public class ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(三)——基本操作
CefSharp本身提供了WPF和WinForm两个版本的控件,这两个版本的控件使用方法大同小异,由于我WPF的版本用的较多,这里就简单的介绍下WPF版的CEFSharp控件的用法. 加载页面: Ch ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(八)——Cookie
CEF中的Cookie是通过CookieManager来管理的,可以用它来设置发送的Cookie. 发送Cookie 发送Cookie的一个基本示例如下: var cookieManager = _c ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(五)——Javascript交互
要在CEF中和网页的JS进行交互,首先我们要通过设置启用Javascrit集成功能. CefSharpSettings.LegacyJavascriptBindingEnabled = true; 调 ...
随机推荐
- 使用渐进式JPEG来提升用户体验
今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别 ...
- LCA 算法(一)ST表
介绍一种解决最近公共祖先的在线算法,st表,它是建立在线性中的rmq问题之上. 代码: //LCA: DFS+ST(RMQ) #include<cstdio> #include&l ...
- js深复制
一般来讲深复制主要是为了复制js对象中的引用类型,引用类型在普通的赋值操作下相当于是引用,修改复制对象也会影响原对象,简单的方法的话可以使用JSON.parse(JSON.stringify(obj) ...
- SocketServer源码学习补充
在前两个文章中整理了关于BaseServer部分以及BaseRequestHandler,以及通过对TCP的处理的流程的整理,这次整理的是剩下的关于用于扩展的部分,这里通过对线程扩展进行整理 Thre ...
- Linux使用一个定时器实现设置任意数量定时器功能【转】
转自:https://www.jb51.net/article/120748.htm 为什么需要这个功能,因为大多数计算机软件时钟系统通常只能有一个时钟触发一次中断.当运行多个任务时,我们会想要多个定 ...
- Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层【转】
转自:http://blog.csdn.net/droidphone/article/details/7497787 在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本 ...
- 大数据系列之并行计算引擎Spark部署及应用
相关博文: 大数据系列之并行计算引擎Spark介绍 之前介绍过关于Spark的程序运行模式有三种: 1.Local模式: 2.standalone(独立模式) 3.Yarn/mesos模式 本文将介绍 ...
- vue 兼容IE报错解决方案
IE 页面空白 报错信息 此时页面一片空白 报错原因 Babel 默认只转换新的 JavaScript 语法(如箭头函数),而不转换新的 API ,比如 Iterator.Generator.Set. ...
- ssh远程免密登录Linux
一.在本地机器创建公钥,一路回车即可 ssh-keygen -t rsa 二.发送公钥到远程服务器端 如果是默认端口:scp id_rsa.pub user@ip:~/.shh 如果远程服务器设置的是 ...
- Nginx安装方式探究
Ubuntu 16.04(阿里云ECS),Nginx 1.10.3 (Ubuntu) 本文探究两种安装方式: 1.源码安装(手动) 2.APT安装(自动) 源码安装(手动) 步骤简介: 下载.解压.. ...