自己总结的不一定对,还望大佬指点,及时更正
1、一个CefClient 对应一个浏览器窗口
2、一个CefBrowser 对应一个浏览器标签页
(这里要注意:CefBrowser与Browser进程不是一个概念,不要混淆,后面会介绍Browser进程和Render进程)
3、一个浏览器窗口有多个标签页,一个CefClient可以对应多个CefBrowser,创建CefBrowser时必须指定CefClient
4、一个CefBrowser会启动一个Render进程,该Render进程负责该CefBrowser的HTML内容解析渲染和JS引擎处理
5、一个Render进程会绑定一个CefV8Handler
换句话讲三者一个整体,(CefBrowser、CefRenderProcessHandler、CefV8Handler)
程序中我们只需CefBrowserHost::CreateBrowser(),函数后,会自动生成上面的一个整体。
同时该函数,会将CefBrowser与指定CefClient绑定。
6、由于CefBrowser与Render进程不在一个进程中,虽然二者为一个整体,但是不在一个进程中,可通过消息进行传递,也就是Browser进程与Render进程通讯,Browser进程也就是主进程,主进程中启动Browser,二者为同一个进程中。
换句话讲:CEF程序启动,会产生一个主进程多个子进程,其中每个CefBrowser实例在主进程中创建并使用,每创建一个CefBrowser会增加一个Render子进程,负责对该CefBrowser的HTML内容进行渲染和JS处理。并且必要时候,通过消息投递给主进程(也就是Browser进程),主进程中,与该CefBrowser绑定的CefClient接收该消息,并进行处理。
使用时候,可以一个CefBrowser对应一个CefClient,也可以多个CefBrowser对应一个CefClient,多对一的时候,可能会有延迟但不阻塞的情况,例如上一个Render子进程投递消息后,CefClient处理该消息时间较长,花费10s后,再次读取消息时,才会处理第二个子进程投递来的消息,这个没有验证,有兴趣的同学可以试试。