Cobalt浏览器简介
1 CobaltCobalt是一个轻量级HTML5/CSS/JS应用程序容器,旨在以最少的资源消耗(部署大小,RAM,CPU,GPU)提供丰富的应用程序开发环境。同时,Cobalt在各种平台和设备上实现丰富,低延迟的用户体验这些是Cobalt提供的其他一些好处More platformsCobalt不需要平台来支持JIT编译,并且可以在不允许执行动态生成代码的平台上运行Co...
1 Cobalt
Cobalt是一个轻量级HTML5/CSS/JS应用程序容器,旨在以最少的资源消耗(部署大小,RAM,CPU,GPU)提供丰富的应用程序开发环境。同时,Cobalt在各种平台和设备上实现丰富,低延迟的用户体验
这些是Cobalt提供的其他一些好处
More platforms
- Cobalt不需要平台来支持JIT编译,并且可以在不允许执行动态生成代码的平台上运行
- Cobalt是一个单进程应用程序,不依赖于多个进程
- Cobalt预编译一组足以表达所有图形效果的着色器,从而适应无法在运行时编译着色器的平台
- Cobalt需要一个兼容的C++ 03编译器,允许它通过传统工具链访问平台
Small footprint
- Cobalt针对内存进行了优化。 它的surface缓存永远不会超过预定义的预算,并且它永远不会创建重复的图层,从而减少了内存不足崩溃的可能性
- Cobalt的小二进制文件旨在占用尽可能小的空间。 通过支持HTML5/CSS/JS的一个子集,Cobalt的缩小封装尺寸甚至允许在低端设备上捆绑CJK字体
Reduced input latency
- Cobalt通过仅支持不影响布局的属性动画(如变换)并始终在单独的线程上运行动画来产生一致的60FPS动画
- 由于渲染器和资源加载器不会与布局操作相竞争,因此Cobalt已针对单核CPU运行进行了优化,从而延长了输入延迟时间
- 在支持GLES2的平台上,Cobalt通过在GPU上执行几乎所有的渲染操作来避免CPU绘图
2 Architecture
Cobalt作者分叉了H5VCC,删除了大部分Chromium代码 ,特别是WebCore和Chrome Renderer和Compositor,并且从零开始构建了一个简化的HTML子集的实现,用于布局的CSS Box模型以及Web API,这是真正需要建立一个全屏幕SPA浏览和播放应用程序,Cobalt的组件主要有以下几个部分
Web Implementation
这是实现W3C标准的地方,最终生成一个带注释的DOM树,该树可以传递到布局引擎以生成渲染树JavaScript Engine
我们没有从头开始写自己的JavaScript引擎。 由于JITing约束,我们必须灵活地使用与我们合作的引擎。 我们有一个与JS Engine接口的绑定层,以便应用程序脚本可以与本机支持的对象(如DOM元素)交互Layout Engine
布局引擎接收由Web实现和JavaScript引擎生成的带注释的DOM文档,并计算渲染命令的树以发送给渲染器(即渲染树)。 它缓存中间布局工件,以便后续的增量布局可以加快Renderer/Skia
渲染器遍历由布局引擎生成的渲染树,使用第三方图形库Skia对其进行栅格化处理,并将其交换到前端缓冲区。 这里有两条主要路径,一条是在OpenGL ES 2.0上使用Hardware Skia,另一条是使用Software Skia和硬件加速的Starboard Blitter请注意,渲染器在与布局引擎不同的线程中运行,并且可以插入不需要重新布局的动画。这可以将Layout和JavaScript渲染分离出来,从而在具有各种功能的平台上实现流畅,一致的动画
Net/Media
这些是Chromium的网络和媒体引擎。 我们直接使用它们,因为它们不会引起上面列出的额外限制的任何特定问题Base
这是Chromium的“Base”库,其中包含在Cobalt,Net和Media中使用的各种有用的东西。Cobalt使用标准C++容器(例如vector,string)和Base的组合作为其所有代码的基础库Other Third-party Libraries
其中大部分是其他开放源代码软件中通常包含的straight-C开源库。 大多数格式的解码器和解析器(例如libpng,libxml2,zlib)。我们从Chromium中分离出来,因为我们希望它们成为这些库经过测试最多的版本Starboard/Glimp/ANGLE
Starboard是Cobalt移植接口。Cobalt和Chromium之间的一个主要区别是我们创建了一个hard straight-C移植层,并且移植了所有编译后的代码,包括Base和所有第三方库,以使用它,而不是直接使用POSIX标准库,它们是即使在现代系统上也不一致(请参阅Android,Windows,MacOS X和iOS)。此外,Starboard还包括跨平台没有得到有效标准化的API,例如显示窗口创建,输入事件和媒体播放Glimp是由Cobalt团队直接在Starboard上构建的OpenGL ES 2.0实现框架,旨在将专有3D API修改为GLES2
ANGLE是一种第三方库,可将DirectX与Glimp类似,但仅适用于DirectX
3 Display And Media
Cobalt能够支持与加密媒体扩展兼容的任何DRM系统,但这仅在PlayReady和Widevine两种产品上得到充分验证。因为版权原因使得难以提供与Widevine或PlayReady的开源参考集成,所以目前由平台实施者来集成代码来生成许可证,安装密钥并在解码之前解密样本,请注意,不需要更改src/media中的任何代码来执行此操作,只需实现Starboard player/drm/media API即可完成此操作
目前Cobalt有OpenMax和ffmpeg的对接代码,没有Gstreamer的,显示部分Wayland+EFL、X11、Directfb、Win32都有集成,可以直接使用
3.1 Drm Implementing APIs
函数 |
---|
SbDrmSessionUpdateRequestFunc |
SbDrmSessionUpdatedFunc |
SbDrmSessionKeyStatusesChangedFunc |
SbDrmCreateSystem |
SbDrmGenerateSessionUpdateRequest |
SbDrmUpdateSession |
SbDrmCloseSession |
SbDrmGetKeyCount |
SbDrmGetKeyStatus |
SbDrmRemoveAllKeys |
SbDrmDestroySystem |
3.2 Video Implementing APIs
函数 |
---|
SbPlayerDestroy |
SbPlayerWriteEndOfStream |
SbPlayerWriteSample |
SbPlayerSetPlaybackRate |
SbPlayerSeek |
SbPlayerSetVolume |
SbPlayerGetInfo |
SbPlayerOutputModeSupported |
SbPlayerCreate |
SbPlayerGetCurrentFrame |
SbPlayerSetBounds |
GetAudioCodecFromString |
SbMediaIsAudioSupported |
GetVideoCodecFromString |
ParseH264Info |
SbMediaIsVideoSupported |
IsAudioOutputSupported |
GetTransferIdFromString |
SbAudioSinkIsAudioFrameStorageTypeSupported |
SbAudioSinkIsAudioSampleTypeSupported |
SbAudioSinkGetMaxChannels |
SbAudioSinkCreate |
SbAudioSinkIsValid |
SbAudioSinkDestroy |
更多推荐
所有评论(0)