2011-06-19 29 views
5

Tengo un juego simple que representa gráficos 2D en un búfer de cuadros (sin utilizar ningún OpenGL). Iba a usar CVDisplayLink para obtener una tasa de fotogramas limpia, sin embargo, la mayoría de los ejemplos en la web tratan con OpenGL o QuickTime.Cómo dibujar a un contexto de gráficos NSView desde dentro de una devolución de llamada CVDisplayLink?

Hasta ahora tengo una subclase de NSView:

@interface GameView : NSView { 
@private 
    CVDisplayLinkRef displayLink; 
} 

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime; 
@end 

Y me juego hasta la devolución de llamada CVDisplayLink:

CVDisplayLinkSetOutputCallback(displayLink, MyDisplayLinkCallback, self); 

Y tengo la función de devolución de llamada:

La parte donde estoy atascado es qué hacer en getFrameForTime: para dibujar en el contexto gráfico en el GameVi ew. Mi primera suposición era para hacer el dibujo de la misma manera que lo haría en drawRect:

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime 
{ 
    CGContextRef ctxCurrent = [[NSGraphicsContext currentContext] graphicsPort]; 

    //.. Drawing code follows 
} 

Pero ctxCurrent es nil que creo que entiendo - normalmente hay alguna configuración que ocurre antes de la drawRect: que hace que su punto de vista el contexto actual. Creo que esta es la parte que me falta. ¿Cómo obtengo el contexto para mi vista?

¿O estoy hablando de esto de las formas incorrectas?

Respuesta

2

Puede dejar su código de dibujo en ‑drawRect: y luego en su MyDisplayLinkCallback() establecer un ivar a la hora actual y llame al ‑display en su vista. Esto obligará a su vista a volver a dibujarse inmediatamente.

En su método ‑drawRect:, simplemente use el valor del tiempo ivar para hacer cualquier dibujo que sea necesario para actualizar la vista apropiadamente para el cuadro de animación actual.

+0

Gracias, esto está funcionando y parece ser el más limpio que he encontrado hasta ahora. – John

0

Debe crear un método -draw: por separado, y llamarlo desde su MyDisplayLinkCallback(), así como desde -drawRect:.

Encontré el response de Rob Keniger y lo probé; lamentablemente, si llama al -display desde la devolución de llamada de su enlace de pantalla, su aplicación puede bloquearse en un punto muerto cuando finalice la aplicación, dejándole forzar el cierre de la aplicación (en mi caso, esto sucedió con mayor frecuencia).

+1

Agregue un enlace a la respuesta de Rob Keniger. Sería muy interesante ver eso. – SalmonKiller

+0

@SalmonKiller: ¿Cómo puedo vincular? Es la respuesta actualmente aceptada justo por encima de la mía. – placeitintheblob

Cuestiones relacionadas