@
jukka cont.
据我所知,现代浏览器引擎主要的绘图工作是委托给 Cairo , CoreGraphics , Skia 这样的 2D 绘图引擎的。如果一般人要从零开始写这样一个绘图引擎,也应该主要使用 CPU 算法(根据我有限的 CG 知识,类似的算法也会在 GPU 底层被应用)。我上面所列举出的库,可能在实现细节中利用了 GPU 的 3D 加速,但是这部分内容和楼主的目的距离就太远了。不同的硬件,不同的 OS ,可能使用不同的渲染引擎,不同的渲染方式,我觉得这不是楼主想要的东西。
关于利用 GPU 进行 2D 渲染的问题,可以看一下这个项目
https://github.com/memononen/nanovg ,非常精致的一个库。不过在功能上好像依然没办法和 Cairo 这样高大全的项目相比。学术界也有一摞的 paper ,然而我还没有见到过大规模实际应用的详细信息。顺便, Khronos 是有矢量绘图 API 标准 OpenVG 的,但是目前的硬件实现好像并不能达到 universal 的程度(据说移动 GPU 有实现,桌面端的话, NVIDIA 在 OpenGL 上面做了一个扩展 NV_path_rendering ,并且做了一堆的广告)。
不过另一方面, Web 前端中是有 Hardware Acceleration 和 OpenGL 的概念的。这里可以和大家分享一下我的理解(主要来源于 WebKit 引擎, Apple 官方 repo ):
* WebGL 。这个很直接,就是调用 GL 的 API 绘图,不过 WebGL 提供的 API 是 GLES 的(在 Win 里面可能被 ANGEL 转换掉了)。
* Canvas 。可以理解为 Cairo 等绘图引擎的接口直接暴露给了 JS 。灵活性高(理论上所有用其他元素能画出来的东西都能画出来,其他元素画不出来的照样画不出来),效率不大好说,但是最后还是由绘图引擎进行实际的绘图。
* Composition 。概念上类似于基于 Sprite 的 2D 游戏,就是将某些元素单独渲染到 GPU 贴图上,再渲染到页面中,目的是在动画发生时无需使用 2D 绘图引擎重绘该部分。当然有一个假定前提就是动画过程中该部分内容不会发生改变,因为根据以上所述, GPU 在绘图过程中扮演的角色是有限的,更准确的说,其能做的所有事情就是 play with the sprite ,面片的透明度、颜色、 transform , etc. 这就是熟悉 CSS 的同学们喜闻乐见的 translate/scale/rotate3d, opacity 等属性的“硬件加速”。
不过需要注意的是这也不是必须的,因为基本都是 2D 引擎可以模拟出来的东西,编译时 FLAG 关掉,就可以 fallback 到 2D 的渲染模式。
如果有做 iOS 的同学的话,可以打个比方:浏览器中核心绘图引擎的作用类似于 CoreGraphics , OpenGL 的作用类似于 CoreAnimation ,当然有可能 CoreAnimation 的底层就是 OpenGL 。