Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不同屏幕上绘制Cocoa将失去性能_Cocoa_Screen_Nsview_Core Video_Cadisplaylink - Fatal编程技术网

在不同屏幕上绘制Cocoa将失去性能

在不同屏幕上绘制Cocoa将失去性能,cocoa,screen,nsview,core-video,cadisplaylink,Cocoa,Screen,Nsview,Core Video,Cadisplaylink,我有一个基于文档的应用程序,其中每个文档都有一个带有NSScrollView的窗口,该窗口只使用Cocoa进行一些(相当连续的)绘图 要调用图形,我使用CVDisplayLink,代码如下所示: - (void)windowControllerDidLoadNib:(NSWindowController *) aController { //other stuff... [self prepareDisplayLink]; //For some reason putting

我有一个基于文档的应用程序,其中每个文档都有一个带有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更可取)进行渲染,结果相同

我做错了什么? 非常感谢您的帮助

编辑:我也尝试过使用基于线程的绘图,同样得到了相同的结果


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

绘制帧的速度有多快?问题似乎是,该卡只能继续重新提取一定数量的数据。您是否正在绘制彼此独立的动画?尝试同时重新绘制所有动画


问题似乎来自amdirect与视频卡的设备驱动程序以及您的逻辑的交互。祝你好运。

每次文档进入新屏幕时,是否都尝试调用prepareDisplayLink?也许能胜任。您可以从windowDidMove功能中检测到这一点。

您测试过哪些GPU和OS X版本?由于在基于NSTimer的刷新时遇到相同的问题,因此问题更可能出现在您未发布的渲染代码中。我已在NVIDIA GeForce 9400M、NVIDIA GeForce 9600M GT和NVIDIA GeForce 320M上进行了测试,所有这些都使用OS X 10.6.7。我在渲染代码中进行了编辑。在旧的非线性视频编辑器中,我经常看到这一点,您只能在主监视器中查看视频播放,有时可以在辅助监视器中拖动,有时不能。您可以尝试的一件事是,如果应用程序打开第二个监视器上的窗口,会发生什么。。。很可能,当你移动到第二个GPU时,你无法将整个环境与视图结合起来,而被迫进行软件渲染。第二个GPU?这种情况也发生在带有一个图形卡的计算机上。另外,请参见编辑。您能否制作一个展示问题的最小示例项目,并发布到源代码的链接?