Смешивать кварц и OpenGL? - PullRequest
       25

Смешивать кварц и OpenGL?

20 голосов
/ 23 августа 2011

Я пытаюсь выяснить, что на самом деле происходит в фоновом режиме, когда мы делаем это (см. Изображение)

enter image description here

Как вы можете видеть на изображении, я добавил несколько кнопок и проверил окно Content View от Interface Builder для окна.

Теперь, как мы знаем, он будет использовать базовую анимацию или, скажем, создаст слои (Пожалуйста, поправьте меня, если я ошибаюсь. Все еще учусь ...)

Я хочу знать, как нарисованы эти кнопки?

Я предполагаю, что когда мы отмечаем Content View, эти кнопки берутся из CGBitmapContextRef, а созданное из них растровое изображение передается в Core Animation (OpenGL). Но я пока не могу доказать это. Как мне это доказать? Какой-нибудь пример или какая-то подходящая идея была бы великолепна?

Я уверен в том, что кнопки созданы из CGBitmapContextRef. Но что происходит с этими изображениями кнопок, неизвестно.

Может кто-нибудь объяснить, как возможна эта интеграция? Как эти изображения попали на экран?

Edit:

Чтобы добавить больше информации по той же теме, пожалуйста, проверьте изображение ниже для слоев OpenGL. Я думаю, что нацеливаюсь на общий слой OpenGL Framework . enter image description here

Ответы [ 2 ]

1 голос
/ 20 апреля 2012

Я бы начал с создания узкой петли, которая перетягивает ваши кнопки навсегда.Затем, пока он работает, используйте Activity Monitor, чтобы выполнить пробную трассировку вашего процесса.Вы увидите все пути кода, необходимые для рисования кнопок.Вы должны быть в состоянии увидеть, что происходит оттуда, по именам подпрограмм в стеке чертежей.Если вы не можете понять это, опубликуйте соответствующие фрагменты здесь, и мы могли бы взглянуть.

0 голосов
/ 17 января 2013

Кнопки отрисовываются на CGBitmapContextRef.

Допустим, у нас есть объект CGBitmapContextRef, созданный с использованием

CGContextRef CGBitmapContextCreate (
   void *data,
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bytesPerRow,
   CGColorSpaceRef colorspace,
   CGBitmapInfo bitmapInfo
);

Здесь void *data - указатель на место назначения в памяти, где чертеж должен быть представлен.

CGContext API может затем использоваться для выполнения различных операций на data. Таким образом на нем можно нарисовать кнопки и фон.

После этого мы можем освободить CGContextRef, но данные все еще находятся в памяти и могут быть переданы в OpenGLContext (CGLContextObj).

Я до сих пор не знаю, как он загружает data в CGLContextObj. Должно быть, используется какой-то приватный API.

...