在不同屏幕上绘制可可会失去性能



我有一个基于文档的应用程序,其中每个文档都有一个带有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]];
}

这很好用,而且动画很黄油.....在一个屏幕上。

一旦我将一个文档从主屏幕上移到第二个显示器上,动画就会变得像带有方形轮子的汽车一样流畅。当任何一个(或多个)文档位于第二个屏幕上时,所有文档中的动画都会变差。主屏幕上不能有文档,辅助屏幕上不能有任何文档,动画也会降级。

我已经在多种类型的显示器和多台 Mac 上尝试过这个,总是以这些结果结束。为了确保这不是与CVDisplayLink相关的问题,我还尝试使用NSTimer(CVDisplayLink更可取)进行渲染,结果相同。

我做错了什么?任何帮助将不胜感激。

编辑:我也尝试使用基于线程的绘图,再次得到相同的结果。

编辑:我取得了一些进展,因为我的基于线程的绘图(基本上是一个while循环)仅在一个屏幕上运行良好。(第二个或第一个)。

您是否尝试过每次文档进入新屏幕时调用 prepareDisplayLink?可能会完成这项工作。您可以从windowDidMove函数中检测到这一点。

你重新绘制框架的速度有多快?问题似乎是卡只能不断重新绘制一定量的数据。您是否重新绘制每个动画彼此独立?尝试同时重绘所有动画。

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

相关内容

  • 没有找到相关文章

最新更新