cocoa screen nsview core-video cadisplaylink

cocoa - El dibujo de cacao en diferentes pantallas pierde rendimiento



screen nsview (2)

Tengo una aplicación basada en documentos, donde cada documento tiene una ventana con un NSScrollView que realiza un dibujo (bastante continuo) usando solo Cocoa.

Para llamar al dibujo, estoy usando CVDisplayLink, que se describe en el siguiente código:

- (void)windowControllerDidLoadNib:(NSWindowController *) aController { //other stuff... [self prepareDisplayLink]; //For some reason putting this in awakeFromNib crashes } //Prep the display link. - (void)prepareDisplayLink { CVDisplayLinkCreateWithActiveCGDisplays(&displayLink); CVDisplayLinkSetCurrentCGDisplay(displayLink, ((CGDirectDisplayID)[[[[[self windowForSheet]screen]deviceDescription]objectForKey:@"NSScreenNumber"]intValue])); CVDisplayLinkSetOutputCallback(displayLink, &MyDisplayLinkCallback, self); } //Callback to draw frame static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext) { NSAutoreleasePool *pool =[[NSAutoreleasePool alloc]init]; CVReturn result = [(ScrollView*)displayLinkContext getFrameForTime:outputTime]; [pool drain]; return result; } //Drawing function: - (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime { [scrollView lockFocusIfCanDraw]; [self addToCurrentPostion:(dist/time)*CVDisplayLinkGetActualOutputVideoRefreshPeriod(displayLink)]; //Redraws the scrollview]; [scrollView unlockFocus]; return kCVReturnSuccess; } //Set the display when the window moves: - (void)windowDidMove:(NSNotification *)notification { if ([notification object] == [self windowForSheet]) { CVDisplayLinkSetCurrentCGDisplay(displayLink, ((CGDirectDisplayID)[[[[[self windowForSheet]screen]deviceDescription]objectForKey:@"NSScreenNumber"]intValue])); } } //Start or stop the animation: - (IBAction)toggleAnim:(id)sender { if (CVDisplayLinkIsRunning(displayLink)) { CVDisplayLinkStop(displayLink); } else { CVDisplayLinkStart(displayLink); } }

Código de representación:

- (void)addToCurrentPostion:(float)amnt { fCurrentPosition += amnt; //fCurrentPositon is a float ivar if (scrollView) [[scrollView contentView]scrollToPoint:NSMakePoint(0,(int)fCurrentPosition)]; if (scrollView) [scrollView reflectScrolledClipView:[scrollView contentView]]; }

Esto funciona muy bien, y la animación es mantecosa ... en una pantalla.

Tan pronto como muevo un documento fuera de la pantalla principal, a un segundo monitor, la animación se vuelve tan suave como un automóvil con ruedas cuadradas. La animación se vuelve pobre en todos los documentos cuando uno (o más) documentos se encuentran en la segunda pantalla. No puede haber documentos en la pantalla principal y ninguno en la pantalla secundaria y la animación también se degradará.

Intenté esto con varios tipos de monitores y múltiples Mac, siempre terminando en estos resultados. Para asegurarme de que esto no era un problema relacionado con CVDisplayLink, también intenté renderizar usando un NSTimer (que es preferible a CVDisplayLink), con los mismos resultados.

¿Qué estoy haciendo mal? Cualquier ayuda es muy apreciada.

EDITAR: He intentado también usar el dibujo basado en hilos, nuevamente con los mismos resultados.

EDITAR: He hecho algunos progresos, en el sentido de que mi dibujo basado en hilos (básicamente un ciclo while) funciona muy bien en una sola pantalla. (Ya sea el segundo o el primero).


¿Has intentado llamar a prepareDisplayLink cada vez que el documento ingresa a una nueva pantalla? Podría hacer el trabajo. Puede detectarlo desde la función windowDidMove.


¿Qué tan rápido estás volviendo a dibujar los cuadros? El problema parece ser que la tarjeta solo puede seguir volviendo a dibujar una cierta cantidad de datos. ¿Estás volviendo a dibujar cada animación independientemente el uno del otro? Intente volver a dibujar todas las animaciones al mismo tiempo.

El problema parece provenir de la interacción amdirect con el controlador del dispositivo de la tarjeta de video y con su lógica. Buena suerte.