在不同的屏幕上绘制的cocoa失去了performance

我有一个基于文档的应用程序,其中每个文档有一个NSScrollView窗口,只使用Cocoa进行一些(相当连续的)绘图。

要调用绘图,我正在使用下面代码中概述的CVDisplayLink:

- (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); } } 

渲染代码:

 - (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]]; } 

这个工程很好,animation是在一个屏幕上的黄油…..

只要我把一个文件从主屏幕上移到另一个监视器上,animation就像一个方形的车轮一样平滑。 当任何一个(或多个)文档在第二个屏幕上时,animation在所有文档中变得很差。 主屏幕上没有任何文件,副屏幕上也没有文件,animation也会降级。

我已经尝试了多种types的显示器和多个Mac,总是以这些结果结束。 为了确保这不是一个CVDisplayLink相关的问题,我也尝试使用NSTimer(其中CVDisplayLink更好)渲染,具有相同的结果。

我究竟做错了什么? 任何帮助是极大的赞赏。

编辑:我已经尝试使用基于线程的绘图,也是一样的结果。

编辑:我已经取得了一些进展,因为我的基于线程的绘图(基本上是一个while循环)只在一个屏幕上工作得很好。 (可以是第二个或第一个)。

每次文档进入新屏幕时,您是否尝试过调用prepareDisplayLink? 可以做这个工作。 你可以从windowDidMove函数中检测到。

你重新画框的速度有多快? 问题似乎是卡片只能重新绘制一定数量的数据。 你是否重新绘制每个animation相互独立? 尝试在同一时间重新绘制所有的animation。

问题似乎来自与video卡的设备驱动程序和逻辑的直接交互。 祝你好运。