PC游戏中用CEF3制作内嵌浏览器

因为项目需要,需要将游戏手机助手中的朋友圈给移植到PC游戏中,而以前游戏中的内嵌浏览器采用的是IE6内核,满足不了我们的需求,于是决定把Cef3内嵌到游戏中,在完成正常工作之余,利用闲散时间不断地查找各种资料,初步完成了项目需求,决定写一篇文章来记录我碰到的各种坑。

一开始我只是在网上找了一个最后支持XP系统的版本–2623版本,利用这个版本进行开发,后来发现不支持MP3、MP4,是需要重新编译一个支持MP3、MP4的版本的,在网上找一个已编译好了的版本(在Windows下编译Cef3.2623并加入mp3、mp4支持(附带源码包和最终DLL)),最后把一些dll、资源等替换下就行,并不需要更改工程代码,非常感谢Redrain!附上链接:http://blog.csdn.net/zhuhongshu/article/details/54193842

一、首先来了解下Cef3

CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目。CEF的典型应用场景包括:

嵌入一个兼容HTML5的浏览器控件到一个已经存在的本地应用。

· 创建一个轻量化的壳浏览器,用以托管主要用Web技术开发的应用。

· 有些应用有独立的绘制框架,使用CEF对Web内容做离线渲染。

· 使用CEF做自动化Web测试。

CEF3是基于Chomuim Content API多进程构架的下一代CEF,拥有下列优势:

· 改进的性能和稳定性(JavaScript和插件在一个独立的进程内执行)。

· 支持Retina显示器。

· 支持WebGL和3D CSS的GPU加速。

· 类似WebRTC和语音输入这样的前卫特性。

· 通过DevTools远程调试协议以及ChromeDriver2提供更好的自动化UI测试。

· 更快获得当前以及未来的Web特性和标准的能力。

翻译自https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage.md

看不懂英文的可以看这篇GeneralUsage翻译文:https://github.com/fanfeilong/cefutil/blob/master/doc/CEF General Usage-zh-cn.md#important-concepts

二、二进制文件及资源文件说明

在这里插入图片描述
有些文件是必须的,否则无法运行

  • CEF core library.
    libcef.dll(Cef核心文件,含js引擎、网页加载渲染逻辑等)

  • Crash reporting library.
    chrome_elf.dll(我还没用上)

  • Unicode support data.
    icudtl.dat(支持Unicode需要)

  • V8 snapshot data.
    natives_blob.bin
    snapshot_blob.bin
    (V8引擎快照数据需要)

有些是根据情况可删减的,cef可以继续运行,或缺失部分功能:

  • Localized resources.
    Locale file loading can be disabled completely using
    CefSettings.pack_loading_disabled. The locales directory path can be
    customized using CefSettings.locales_dir_path. (可设置本地资源的路径)

    • locales/
      Directory containing localized resources used by CEF, Chromium and Blink. A
      .pak file is loaded from this directory based on the CefSettings.locale
      value. Only configured locales need to be distributed. If no locale is
      configured the default locale of “en-US” will be used. Without these files
      arbitrary Web components may display incorrectly.(CEF,Chromium和Blink使用的本地化资源。如果没有区域设置将配置默认语言环境“en-US”。如果没有这些文件任意Web组件可能显示不正确。)
  • Other resources.
    Pack file loading can be disabled completely using
    CefSettings.pack_loading_disabled. The resources directory path can be
    customized using CefSettings.resources_dir_path.

    • cef.pak

    • cef_100_percent.pak

    • cef_200_percent.pak
      These files contain non-localized resources used by CEF, Chromium and Blink.
      Without these files arbitrary Web components may display incorrectly.(这些文件包含了供CEF使用的区域无关资源,缺少这些文件任意Web组件可能显示不正确。)

    • cef_extensions.pak
      This file contains non-localized resources required for extension loading.
      Pass the --disable-extensions command-line flag to disable use of this
      file. Without this file components that depend on the extension system,
      such as the PDF viewer, will not function.(此文件包含扩展加载所需的非本地化资源传递--disable-extensions命令行标志来禁止使用文件。没有这个文件,依赖于扩展系统的组件将不起作用,如PDF查看器。)

    • devtools_resources.pak
      This file contains non-localized resources required for Chrome Developer
      Tools. Without this file Chrome Developer Tools will not function.( 此文件包含Chrome开发者工具所需的非本地化资源,缺少这个文件,Chrome开发者工具将无法运行。)

  • Angle and Direct3D support.

    • d3dcompiler_43.dll (required for Windows XP)
    • d3dcompiler_47.dll (required for Windows Vista and newer)
    • libEGL.dll
    • libGLESv2.dll
      Without these files HTML5 accelerated content like 2D canvas, 3D CSS and WebGL
      will not function.(Direct3D支持文件,如果缺少这些文件,HTML5在渲染2D画布,3D CSS,WebGL时将不起作用。)
  • Widevine CDM support.

三、引入到工程中

因为是内嵌在我们自己的项目中,所以只需要给工程中引入cef3,将一些dll等资源文件加入到工程exe所在目录下,在我们自己的第三方库文件夹中加入了cef3文件夹,里面加入cef的include文件夹,和lib文件夹,lib文件夹里分别放入的是debug版本和release版本的libcef.lib文件和libcef_dll_wrapper.lib文件。
配置项目属性:
C/C++ ->常规附加包含目录中加入cef的include目录所在路径
链接器->输入添加附加依赖项libcef.lib和libcef_dll_wrapper.lib
利用CMAKE创建cef3的demo工程,找到cefsimole工程,改造cefsimple工程的代码,是满足我们的需求。当然你的需求很复杂,还是建议看看cefclient工程。cefclient是一个完整的CEF客户端应用程序示例,并且它的源码包含在CEF每个二进制发布包中。使用CEF创建一个新的应用程序,最简单的方法是先从cefclient应用程序开始,删除你不需要的部分。本文档中许多示例都是来源于cefclient应用程序。

在这里插入图片描述
在我们在开发之前,需要知道一些cef的基础概念。如果你和我一样是一个新手,建议还是先了解了解基础知识。

四、Cef基础概念

1、多进程架构
首先你要知道cef3是多进程架构的,这点非常重要。Browser被定义为主进程,负责窗口管理,界面绘制和网络交互Blink的渲染和Js的执行被放在一个独立的Render 进程中;除此之外,Render进程还负责Js Binding和对Dom节点的访问。 默认的进程模型中,会为每个标签页创建一个新的Render进程。其他进程按需创建,例如管理插件的进程以及处理合成加速的进程等都是按需创建。
默认情况下,主应用程序会被多次启动运行各自独立的进程。这是通过传递不同的命令行参数给CefExecuteProcess函数做到的。如果主应用程序很大,加载时间比较长,或者不能在非浏览器进程里使用,则宿主程序可使用独立的可执行文件去运行这些进程。这可以通过配置CefSettings.browser_subprocess_path变量做到。
CEF3的进程之间可以通过IPC进行通信。Browser和Render进程可以通过发送异步消息进行双向通信。甚至在Render进程可以注册在Browser进程响应的异步JavaScript API。
通过设置命令行的–single-process,CEF3就可以支持用于调试目的的单进程运行模型。
2、多线程
在CEF3中,每个进程都会运行多个线程。完整的线程类型表请参照cef_thread_id_t。例如,在Browser进程中包含如下主要的线程:
TID_UI 线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程。
TID_IO 线程主要负责处理IPC消息以及网络通信。
TID_FILE 线程负责与文件系统交互。
由于CEF采用多线程架构,有必要使用锁和闭包来保证数据的线程安全语义。IMPLEMENT_LOCKING定义提供了Lock()和Unlock()方法以及AutoLock对象来保证不同代码块同步

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值