在不同的屏幕上的Cocoa绘图失去性能

在不同的屏幕上的Cocoa绘图失去性能,第1张

概述我有一个基于文档的应用程序,其中每个文档有一个窗口与一个NSScrollView,做一些(相当连续)绘图使用只有Cocoa。 要调用图形,我使用CVDisplayLink,在下面的代码中概述: - (void)windowControllerDidLoadNib:(NSWindowController *) aController { //other stuff... [sel 我有一个基于文档的应用程序,其中每个文档有一个窗口与一个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 framestatic 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函数检测到。 总结

以上是内存溢出为你收集整理的在不同的屏幕上的Cocoa绘图失去性能全部内容,希望文章能够帮你解决在不同的屏幕上的Cocoa绘图失去性能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1044568.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存