Chrome瀏覽器中的GPU及內存運行
GPU運行篇
整個瀏覽器,從上層通過DOM組織的樹形結構,來管理整個元素的繪製。DOM中的每一個對象,會在渲染過程中關聯到Render Object類。Render Object類下會分布Render Layer,Rander Layer的內容在底層會渲染到 Graphics Layer。
在Graphics Layer以下就是具體的繪製操作,這些繪製操作對於上層(應用網頁)和下層(顯示端)是透明的。通過調用google的圖形庫skia,完成中間的渲染、繪製環節。
chrome的GPU,是多進程運行的,每個進程將有一個或多個Granphic Layer的操作,將所有渲染繪製的單元視為點陣圖(SkBitmap類)進行拷貝、混合操作。整個渲染、繪製過程都是由一個單獨進程完成的,也可以認為是C/S結構中的Server端,將所有的渲染(繪製)命令(Command),通過進程間通信轉換成圖形上下文(Graphics Context)進行操作。其內存由共享內存申請。當所有的渲染繪製操作都完成後,此進程將其搬到顯示設備進行顯示。
2. 內存篇
GPU的內存都通過GpuMemoryBufferImplSharedMemory類進行管理(content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc文件中)。Chrome瀏覽器中GPU的繪製,也可以認為是一種C/S模式,幾乎所有的內存都是客戶端(Client)通過共享內存的方式申請。這樣繪製進程(Server端)就可以通過共享內存的方式進行訪問。
通過SharedMemory類來進行對共享內存空間的統一管理(base/memory/shared_memory.h),最初通過CreateAndMapAnonymous方法(base/memory/shared_memory_posix.cc)創建並映射(Map)出相應內存空間。
如在Linux系統上具體執行,在shared_memory_posix.cc文件中的SharedMemory類(base/memory/shared_memory.h),通過CreateAnonymousSharedMemory方法創建臨時文件(CreateAndOpenFdForTemporaryFile方法):
而後設置所創建內存的大小:
ftruncate(fileno(fp.get()), options.size)
這樣每個進程創建所需要繪製的內存空間,而後通過MapAt方法,將內存數據提供給上層應用使用:
使用周期結束後,通過Unmap方法,調用
munmap(memory_, mapped_size_)
對此段內存解除映射。
TAG:喬治的達摩院 |