2011-08-23 16 views
20

estoy tratando de averiguar lo que realmente sucede en segundo plano cuando hacemos esto (ver la imagen)mezcla de cuarzo y OpenGL?

enter image description here

Como se puede ver en la imagen que he añadido algunos botones y comprobado ver el contenido de Interfaz constructor para ventana

Ahora, como sabemos, hará uso de animación central o, por ejemplo, creará capas. (Por favor corrígeme si estoy equivocado. Todavía estoy estudiando ...)

Quiero saber cómo se dibujan estos botones?

Mi hipótesis es que cuando activamos la Vista de contenido, estos botones se extraen de CGBitmapContextRef y el mapa de bits creado a partir de él se transfiere a Core Animation (OpenGL). Pero no puedo demostrarlo hasta ahora. ¿Cómo lo pruebo? ¿Algún ejemplo o alguna idea de aproximación sería genial?

Cosa de la que estoy seguro son los botones creados a partir de CGBitmapContextRef. Pero lo que sucede con esas imágenes de botón es desconocido.

¿Alguien puede explicar cómo es posible esa integración? ¿Cómo esa imagen habría aparecido en la pantalla?

Editar:

Para añadir algo más de información sobre el mismo tema, por favor, compruebe la imagen de abajo para las capas de OpenGL. Creo que estoy apuntando a capa común OpenGL Framework. enter image description here

+6

No lo sabemos, y no * queremos * saberlo. La integración entre Core Animation y la jerarquía de vistas es un detalle de implementación y podría cambiar en cualquier momento si Apple piensa en una mejor manera de hacerlo. :) –

+0

Realmente no está claro lo que estás preguntando aquí. "¿Cómo se dibujan estos botones?" es realmente vago Si solo quieres saber cómo funciona todo internamente, no lo encontrarás aquí, porque esa es la salsa secreta de Apple. – benzado

+0

Sí, estaba buscando algunos detalles internos. Puede que no sea todo ... pero una agradable discusión sobre el área, algunas ideas, algunas pistas pueden revelar el misterio. – MacGeek

Respuesta

0

Los botones se dibujan en CGBitmapContextRef.

Permite decir, tenemos CGBitmapContextRef impugnados creado usando

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

Aquí void *data, es un puntero al destino en la memoria donde el dibujo es para ser prestados.

CGContext API se puede utilizar para realizar varias operaciones en data. Por lo tanto, los botones y el fondo se pueden dibujar en él.

Una vez hecho esto, podemos liberar el CGContextRef, pero los datos todavía están en la memoria y se pueden pasar a OpenGLContext (CGLContextObj).

Aún no sé cómo se carga data a CGLContextObj. Debe estar usando una API privada.

1

Comenzaría haciendo un círculo cerrado que vuelva a dibujar los botones para siempre. Luego, mientras se está ejecutando, use el Monitor de actividad para hacer un seguimiento de muestra de su proceso. Verá todas las rutas de código que está tomando para dibujar los botones. Debería poder ver lo que está ocurriendo a partir de los nombres de las rutinas en la pila de dibujos. Si no puede encontrarle sentido, publique los bits relevantes aquí y podríamos echarle un vistazo.