2011-08-23 5 views
20

Sto cercando di scoprire cosa succede realmente in background quando facciamo questo (si veda l'immagine)Mixing Quartz e OpenGL?

enter image description here

Come si può vedere nell'immagine ho aggiunto alcuni pulsanti e controllato contenuti da interfaccia costruttore per finestra.

Ora come sappiamo, utilizzerà l'animazione core o say creerà i livelli. (Per favore correggimi se ho torto. Sto ancora studiando ...)

Voglio sapere come vengono disegnati questi pulsanti?

La mia ipotesi è quando spuntiamo la vista del contenuto, questi pulsanti sono disegnati da CGBitmapContextRef e bitmap creati da esso vengono passati a Core Animation (OpenGL). Ma non sono in grado di dimostrarlo finora. Come lo provo? Qualche esempio o qualche idea di approccio sarebbe grandiosa?

Cosa sono sicuro dei pulsanti creati da CGBitmapContextRef. Ma quello che succede a quelle immagini dei pulsanti è sconosciuto.

Qualcuno può spiegare come è possibile tale integrazione? Come quelle immagini avrebbero avuto sullo schermo?

Edit:

Per aggiungere qualche informazione in più sullo stesso argomento, si prega di controllare l'immagine sotto per strati di OpenGL. Penso di avere come target il livello di OpenGL Framework. enter image description here

+6

Non lo sappiamo, e non vogliamo * sapere *. L'integrazione tra Core Animation e la gerarchia delle viste è un dettaglio di implementazione e potrebbe cambiare in qualsiasi momento se Apple pensa a un modo migliore per farlo. :) –

+0

Non è davvero chiaro cosa stai chiedendo qui. "Come vengono disegnati questi pulsanti?" è veramente vago. Se vuoi solo sapere come funziona tutto internamente, non lo troverai qui, perché è la salsa segreta di Apple. – benzado

+0

Sì, stavo cercando alcuni dettagli interni. Potrebbe non essere tutto .. ma qualche bella discussione intorno all'area, alcune idee, alcuni indizi possono rivelare il mistero. – MacGeek

risposta

0

I pulsanti sono disegnati su CGBitmapContextRef.

Diciamo, abbiamo obiettato CGBitmapContextRef creata usando

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

Qui void *data, è un puntatore alla destinazione in memoria in cui il disegno deve essere reso.

L'API di CGContext può essere quindi utilizzata per eseguire varie operazioni su data. Così i pulsanti e lo sfondo possono essere disegnati su di esso.

Una volta terminato, è possibile rilasciare CGContextRef ma i dati sono ancora in memoria e possono essere passati a OpenGLContext (CGLContextObj).

Ancora non so come si carica data a CGLContextObj. Deve usare qualche API privata.

1

Vorrei iniziare creando un ciclo continuo che ridisegna i pulsanti per sempre. Quindi, mentre è in esecuzione, utilizzare Activity Monitor per eseguire un'analisi di esempio del processo. Vedrai tutti i percorsi di codice che sta prendendo per disegnare i pulsanti. Dovresti essere in grado di vedere cosa sta succedendo da lì dai nomi delle routine nella pila di disegni. Se non riesci a dare un senso, postare i pezzi pertinenti e qui e potremmo dare un'occhiata.