CEF基於Chromium,也是多程序模型。關於程序模型,參考這裡:https://www.chromium.org/developers/design-documents/process-models。我還看到一篇韓國人寫的renderer process的文章,也很不錯,在這裡:http://chromium-kr.blogspot.com/2012/06/about-renderer-process.html。
CEF的程序模型,這裡也有一部分描述:https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage。CEF3預設使用multiple processess,CEF1預設支援較為穩定的的單程序模型。
Chromium的程序分為好幾類(content/public/common/content_switches.cc中有程序引數定義,content/app/content_main_runner.cc中對不同程序做了分支處理):
- browser(沒有type引數時預設為browser程序)
- renderer(kRendererProcess)
- plugin(kPluginProcess)
- ppapi-broker(kPpapiBrokerProcess)
- ppapi(kPpapiPluginProcess)
- sandbox-ipc(kSandboxIPCProcess)
- utility(kUtilityProcess)
- zygote(kZygoteProcess,linux)
- gpu-process(kGpuProcess)
這篇文章會提到browser、ppapi、renderer、gpu,其它的我也沒研究,不知道幹嘛的……
CEF支援很多命令列引數(switches)。下面這些原始檔的註釋裡對它支援的switches做了定義:
- tests/cefclient/common/client_switches.cc
- base/base_switches.cc
- cef/libcef/common/cef_switches.cc
- chrome/common/chrome_switches.cc (not all apply)
- content/public/common/content_switches.cc
大多數的Chromium swithes也適用於CEF,可以參考這裡:http://peter.sh/experiments/chromium-command-line-switches/。當然你也可以參考這裡:http://www.chromium.org/developers/how-tos/run-chromium-with-flags。
程序模型開關引數
好啦,下面重點來說程序模型相關的幾個引數中與PPAPI相關的開關(拗口死了,我大部分解釋是由http://peter.sh/experiments/chromium-command-line-switches/的英文而來)。
- –ppapi-in-process
在程序內執行ppapi外掛,加上這個引數執行CEF,ppapi外掛和browser還是不在一個程序……而是和renderer process在一起了……
- –ppapi-out-of-process
指定這個引數時,ppapi外掛會在一個單獨的ppapi process中執行,程序啟動時的命令列引數中有“–type=ppapi”。
這是預設行為。
- –process-per-site
為每個站點分配程序,一個站點的多個頁面會在同一個renderer程序內處理。(比如同一域名下的不同頁面就會被認為是同一站點)
Chrome的預設行為就是這樣。
- –process-per-tab
每個tab相關的頁面分配一個renderer程序。一個tab可能會有多個頁面,比如JS或頁面事件導致的頁面跳轉。
- –site-per-process
強制給一個site分配一個死忠的process,這個process就非這個site不嫁了,嫁了就從一而終。詳情可以看看這裡:http://www.chromium.org/developers/design-documents/site-isolation。
- –force-in-process
在多程序模式下,指定某些apps在主程序中執行,它的值可能是以逗號分隔的列表,比如:
--force-in-process=mojo:native_viewport_service,mojo:network_service
- –single-process
單程序模式執行CEF,開啟這個開關後,browser、renderer、gpu-process等程序合併在一個程序裡,但ppapi會單獨跑一個程序。
- –renderer-process-limit
限制renderer程序數量。Chromium預設是根據系統配置(主要是記憶體)來計算renderer程序的最大值。
組合使用程序模型開關
我想使用單程序的CEF(CEF1是單程序模型),又想用Chromium的新特性,所以還是得用CEF3。可有人說CEF3的多程序模型不穩定,參見這裡的討論:http://www.magpcss.org/ceforum/viewtopic.php?f=7&t=13427。還有這裡:http://magpcss.org/ceforum/viewtopic.php?f=6&t=3427。後來發現Chromium也是這麼說的,見這裡:https://www.chromium.org/developers/design-documents/process-models。
不過如果你真的想用,還是可以通過switches來控制。
- ppapi、renderer、browser三者合一
要達到三者合一,傳遞下面的引數給CEF:
--single-process --ppapi-in-process
- renderer、browser合一,ppapi外掛單獨執行在ppapi程序
傳遞下面的引數:
--single-process --ppapi-out-of-process
其他參考文章:
- CEF Windows開發環境搭建
- CEF載入PPAPI外掛
- VS2013編譯最簡單的PPAPI外掛
- 理解PPAPI的設計
- PPAPI外掛與瀏覽器的互動過程
- Windows下從原始碼編譯CEF
- 編譯PPAPI的media_stream_video示例
- PPAPI外掛的繪圖與輸入事件處理
- 在PPAPI外掛中建立本地視窗
- PPAPI外掛與瀏覽器的通訊
- Windows下從原始碼編譯Skia
- 在PPAPI外掛中使用Skia繪圖
- 載入DLL中的圖片資源生成Skia中的SkBitmap物件
- PPAPI Skia實現的塗鴉板
- PPAPI中使用Chromium的3D圖形介面
- PPAPI中使用OpenGL ES繪圖
- CEF中JS與C 互動
- CEF中Browser程序與Render程序間通訊
写评论
很抱歉,必須登入網站才能發佈留言。