基于 HardwareBuffer 实现 Android 多进程渲染

July 23, 2022 提到多进程渲染,通常会想到 Chrome 浏览器的多进程架构,其每个页面 tab、插件都是运行在独立进程,并且有一个单独的 GPU 进程,这里最明显的好处是可以隔离各模块之间的耦合,即使某个进程卡顿、crash 也不会影响到其它进程,从而提升系统整体的稳定性,特别是 GPU 进程,各厂商提供的图形驱动可能有不同的兼容性问题(参考:Chromium 的 GPU 兼容方案),采用独立进程能有效降低主进程 crash 概率。 对于移动端应用,比如 Android 平台,系统并没有限制多进程的使用,我们也可以使用多进程架构来提升应用的稳定性,比如小程序、直播等场景,又或者应用需要使用 Unreal/Unity 来渲染 3D 效果,使用独立进程在稳定性、内存回收等方面都会有明显收益。而针对渲染,多进程架构比较重要的问题是纹理数据如何传输,比如主进程的相机帧传到渲染进程,渲染进程的结果纹理传回主进程。 Android 系统 API 提供的 Surface 对象支持跨进程传递,可以在一个进程通过 eglCreateWindowSurface 创建 EGLSurface 进行渲染写入,然后在另一个进程的 onFrameAvailable 回调中调用 updateTexImage 获取渲染结果。Android 8.0 之后系统提供了 HardwareBuffer 相关 API,也可用于跨进程纹理传输,相比 Surface 更高效,并且避免了 onFrameAvailable 回调机制导致的时序复杂度。 HardwareBuffer HardwareBuffer wraps a native AHardwareBuffer object, which is aContinue reading “基于 HardwareBuffer 实现 Android 多进程渲染”