CEF离屏渲染


发布于 2020-12-06


CEF的官方文档里面有介绍过Off-Screen Rendering。另外在它的官方示例工程cefclient中,传递命令行参数--off-screen-rendering-enabled可以看到它使用离屏渲染的例子。

离屏渲染的意思是创建一个CEF的浏览器窗口打开一个网页时,并不会真正的去创建一个浏览器窗口。它会接收宿主程序传递给它的鼠标、键盘等窗口事件,然后把网页的画面渲染到一个内存中存成位图格式,再通知传递给宿主程序。宿主程序拿到相关的渲染数据之后,自己决定把渲染的数据绘制到哪里。

CEF离屏渲染底层是用的Chromium中的软件渲染,相比其他的硬件合成渲染方式,性能是比较落后的。在大画面更新的情况下,CPU占用和延迟是有一些影响的。

听起来离屏渲染使用起来有些复杂有些绕,另外性能也不好,那它存在的意义是什么呢?

正常的使用浏览器,会创建一个真窗口,在某些UI环境下,比如DirectUI或者Unity3d里面,是没有真窗口的。如果他们想使用CEF,就可以用离屏渲染,把网页的画面渲染成位图数据,再合成到自己的UI中。

或者你想以特殊的方式显示网页画面,比如3D,这种情况下需要离屏渲染拿到渲染后的位图自己做相应的处理。比如做出透明或者半透明的效果,自己处理像素数据等等。