在iOS系统中,通常一个应用对应一个进程,但是在Webkit发展过程中,基于稳定性和安全性考虑,引入多进程概念,避免单一界面的异常影响整体app运行。
- UIProcess 进程为 app 所在进程,WKWebView 在该进程中提供了大量 API 供开发者与内核交互,比如处理各种delegate回调, 返回上一页等等。
- WebContent 进程对应的是每一个新开的网页,该进程视内存情况可进行复用,某一个WebContent 进程的异常并不会影响到主 app 进程,常见的异常现象为白屏。
- NetWorking 进程,无论多 WKWebView 还是单 WKWebView 场景,都只有唯一的 NetWorking 进程,这种设计主要便于网络请求管理以及保证网络缓存、cookie 等管理的一致性。
- Storage Process:用于实现页面Local Storage的进程。
Webkit基于多进程进行实现,也会带来一些副作用,主要体现在web页面启动时延较大和渲染效率会有所下降:
(1)启动webview需要启动多个进程,本身就是非常耗资源操作,耗时较大。
(2)WebView的渲染进程和GPU进程是独立的,每一帧的更新都要通过IPC调用GPU进程,会造成频繁的IPC进程通信,从而造成性能消耗。
(3)由于跨进程, webview无法像native渲染那样,通过share OpenGL context 渲染线程和GPU线程间共享纹理资源,GPU无法直接使用context光栅化,因此GPU自身的性能发挥也会受影响。