Механизм, с помощью которого ваши растровые изображения в вашем браузере подключаются к процессу 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