2013-07-30 7 views
1

Пожалуйста, исправьте меня, если я ошибаюсь. Я понимаю, что Mac OS X имеет процесс WindowServer, который объединяет окна со всех приложений и выводит окончательное составное изображение на экран. Вопрос заключается в том, когда процесс WindowServer получает «данные Windows» (в некоторой форме, такие как растровые изображения) других приложений. Он реализован через механизм общей памяти между приложениями и процессом WindowServer? Любая информация или указатели/документация по этому вопросу были бы полезны!Как реализован «оконный компоновщик» (процесс WindowServer) в Mac OS X (и iOS)?

Кроме того, iOS реализована аналогично в отношении этого аспекта?

Спасибо!

ответ

8

Механизм, с помощью которого ваши растровые изображения в вашем браузере подключаются к процессу WindowServer, представляет собой недокументированную деталь реализации, которая эффективно «непрозрачна», поэтому даже если вы попытаетесь выяснить, как это работает прямо сейчас, это может измениться с релиз. Тем не менее ...

Если бы мне пришлось угадать, как это работает, я бы предположил, что есть блок разделяемой памяти, который поддерживает каждое окно, и когда ваше окно будет рисовать свою иерархию представлений, [NSGraphicsContext currentContext] настроен так, чтобы указывать на CGContext, который поддерживается этим блоком разделяемой памяти. Когда последовательность рисования окон заканчивается, я предполагаю, что одно или несколько сообщений mach отправляются из вашего процесса в процесс 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