2

Please correct me if I am wrong. My understanding is that Mac OS X has a WindowServer process that composites windows from all applications and draw the final composite image on screen. The question is then where WindowServer process obtains the "windows data" (in some form such as bitmaps) of other applications. Is it implemented through shared memory mechanism between applications and the WindowServer process? Any info or pointers/documentations on this would be helpful!

Also, is iOS implemented similarly regarding this aspect?

Thanks!

4

1 回答 1

11

将窗口位图编组到 WindowServer 进程的机制是一个未记录的实现细节,实际上是“不透明的”,因此即使您现在努力弄清楚它是如何工作的,它也可能会随着版本的不同而变化。那就是说...

如果我不得不猜测它是如何工作的,我的猜测是有一个共享内存块支持每个窗口,并且当您的窗口开始绘制其视图层次结构时,[NSGraphicsContext currentContext]设置为指向支持的 CGContext通过那块共享内存。当窗口绘制序列完成时,我猜想从您的进程向 WindowServer 进程发送一条或多条马赫消息,告诉它是时候呈现刚刚绘制的框架了。

在 iOS 上,Springboard 进程似乎扮演着窗口服务器的角色,我想它们的工作方式类似,但同样,所有这些细节都是未记录的实现细节,因此是不透明的。由于 CoreGraphics 存在于 OSX 和 iOS 中,因此机制相似是理所当然的。

vmmap您可以使用调试器(或 dtrace)找到该假设的一些证据。例如,您可以在所有不同的函数上设置断点(或 dtrace 探针),这些函数可以将虚拟内存区域映射到您的进程(mmap、等),然后在打开新窗口的过程vm_allocate中对输出进行前后比较vmmap. 您会看到有新的 VM 区域已映射到您的进程中,但您不会在断点/dtrace 探针上看到任何相应的命中(即,您的进程中没有任何内容)映射这些区域)。这是窗口服务器进程将共享内存区域映射到您的进程的证据。有关这些区域的元信息使用 mach 消息(很可能)传达给您的进程。在一个简单的示例应用程序上尝试这个,打开一个新窗口并查看vmmap输出的差异,显示这个区域很可能是我们最近创建的窗口的后备存储:

CG backing stores      00000001c73f2000-00000001c74cc000 [  872K] rw-/rw- SM=SHM  
于 2013-07-30T12:48:44.893 回答