2013-07-30 57 views
1

如果我錯了,請糾正我。我的理解是,Mac OS X有一個WindowServer進程,用於合成所有應用程序的窗口,並在屏幕上繪製最終的合成圖像。問題在於WindowServer進程獲取其他應用程序的「窗口數據」(以某種形式,如位圖)。它是通過應用程序和WindowServer進程之間的共享內存機制來實現的嗎?任何信息或指針/文件會有幫助!在Mac OS X(和iOS)中如何實現「窗口合成器」(WindowServer Process)?

另外,在這方面iOS是否同樣實施?

謝謝!

回答

8

窗口位圖被封送到WindowServer進程的機制是一個未公開的實現細節,它實際上是「不透明的」,所以即使你努力弄清楚它現在如何工作,它可能會從釋放釋放。這就是說...

如果我不得不猜測它是如何工作的,我猜測會有一塊共享內存支持每個窗口,並且當你的窗口繪製其視圖層次時,[NSGraphicsContext currentContext]被設置爲指向由該共享內存塊支持的CGContext。當窗口繪圖序列完成時,我猜測一個或多個mach消息從您的進程發送到WindowServer進程,以告訴它現在是時候呈現剛繪製的幀。

在iOS上,Springboard過程似乎扮演着窗口服務器的角色,而且我想象的是類似的作品,但是所有這些細節都是未公開的實現細節,因此是不透明的。由於CoreGraphics在OSX和iOS中均有提供,因此它們的機制相似。

您可以使用vmmap和調試器(或dtrace)找到此假設的一些證據。例如,您可以在可以將虛擬內存區域映射到您的進程(mmap,vm_allocate等)的所有不同功能上設置斷點(或dtrace探針),然後在打開操作之前對vmmap輸出進行前/後比較一個新窗口。您會看到有新的VM區域已映射到您的過程中,但您在斷點/ dtrace探針上看不到任何相應的點擊(即,您的過程中沒有任何映射這些區域)。這是窗口服務器進程將共享內存區域映射到進程中的證據。有關這些區域的元信息將通過使用mach消息(很可能)傳遞給您的過程。在一個簡單的示例應用程序嘗試這個,打開一個新的窗口,看着vmmap輸出的差異顯示了這個區域,這是非常有可能對我們最近創建的窗口後備存儲:

CG backing stores  00000001c73f2000-00000001c74cc000 [ 872K] rw-/rw- SM=SHM