CEF是Chromium Embedded Framework
的简称,是Google公司开发的一个浏览器内核框架,以开源库的方式提供,可以内嵌到第三方程序中用于显示网页以及和网页进行交互。
CEF主要使用C++语言进行开发,目前也有CEF的其他语言的绑定,比如CefSharp就是C#的绑定。
CEF老版本使用的WebKit内核,但从2013年开始,CEF已经使用Google自主研发的Blink内核(网上也有人说,Blink是基于Webkit修改而来,这个无从考证)。
一、官网
CEF的官网是:https://bitbucket.org/chromiumembedded/cef/wiki/Home,国内用户访问可能不会太顺利。
二、版本
CEF经历了CEF1和CEF3两个大版本,CEF1现已基本被淘汰,目前主流的是CEF3。
CEF3在3683
版本之前的版本定义规则为:CEF X.YYYY.A.gHHHHH
,
例如:CEF 3.3626.1895.g7001d56 / Chromium 72.0.3626.121
"X" :cef3的主版本号;
"YYYY" :Chrominum 分支号;
"A" : 代表当前分支中,提交次数的一个增量;
"gHHHHHHH" :取Git Commit的哈希值的7个字符,g为git的首字母
自3683
以后,CEF3的版本定义规则发生了变化,改成了如下样式:CEF 73.1.3+g46cf800
。
我们可以从include\cef_version.h
文件获取CEF版本相关的一些宏:
#define CEF_VERSION "3.3626.1894.g90eb8cc"
#define CEF_VERSION_MAJOR 3
#define CEF_COMMIT_NUMBER 1894
#define CEF_COMMIT_HASH "90eb8ccacc520cd83910a64dbb8fadd1a6c22258"
#define COPYRIGHT_YEAR 2019
#define CHROME_VERSION_MAJOR 72
#define CHROME_VERSION_MINOR 0
#define CHROME_VERSION_BUILD 3626
#define CHROME_VERSION_PATCH 96
三、预编译文件下载
CEF官方提供了Linux(32/64/ARM/ARM64)、MacOS X 64、Win32、Win64平台的预编译好的库文件供下载,下载地址为:http://opensource.spotify.com/cefbuilds/index.html
以Win32平台为例,我们一般下载Standard Distribution
即可:
四、Windows XP支持
CEF 2623
版本是最后一个支持Windows XP的版本,目前官方已经不提供预编译文件供下载,如果需要获取2623版本,有2种方式:
- 从第三方源下载。
- 从官方git下载CEF源码checkout到2623版本进行编译,当然这是一个漫长的过程。
作者已经将编译好的CEF 2623版本上传到https://github.com/winsoft666/cef_binary,该版本集成了对MP4的支持。
五、渲染模式
5.1 窗口模式
这个是CEF的默认模式,在这个模式下,CEF会自动在指定的父窗体下创建一个子窗体,CEF负责图形的绘制、鼠标键盘事件、窗体大小改变事件等,开发者不需要为这些事情操心。更重要的一点,在该模式下CEF支持GPU混合加速,性能更高,兼容性也更好,Chrome等浏览器默认都是采用该模式。
混合加速可以通过
--enable-gpu-compositing
或--disable-gpu-compositing
参数来开启或关闭
我们可以通过Spy++查看CEF自动创建的子窗体:
5.2 离屏渲染模式
离屏渲染(Off-Screen Rendering)简称OSR
。
在该模式下,CEF不会自动创建任何窗体,而是将图像数据返回给调用者,由调用者来负责图像的绘制工作,同时调用者还需要负责鼠标键盘事件、窗口大小改变等事件的处理。
所以,离屏渲染模式可以理解为:调用者将鼠标键盘事件、窗口信息(如大小,DPI等)等传递给CEF,CEF根据这些信息将网页渲染到内存中,然后将内存数据传递给调用者,由调用者来负责显示。
采用这种模式虽然开发工作量比较大,但是灵活性更高,能满足各种定制要求,比如实现透明的、不规则的页面显示。
值得注意的是,该模式不支持混合加速,这就意味着在渲染复杂页面时(特别是有动画的页面)CPU和GPU的占用将高于前面介绍的窗体模式。