Hi Matthias I got frustrated with my own coding and thought I'd take another crack at your animation problem as a diversion...
Here's the result, enjoy -Ken #define DRAW_LINES_BLOCK_SIZE 100 #define DRAW_LINES_BLOCK_DELAY 1 - (void) setFrame:(NSRect) inRect { // I'm assuming you store you lines in an array int lineCount = [lineArray count], leftovers = lineCount % DRAW_LINES_BLOCK_SIZE, blockCount = lineCount / DRAW_LINES_BLOCK_SIZE + ((leftovers == 0) ? 0 : 1); maxBlockIndex = blockCount - 1, i; NSRange subrange = NSMakeRange(0, DRAW_LINES_BLOCK_SIZE); NSInvocation *invocation; NSValue *rangeWrapper; // next variable needs to be defined in the interface if (invocationStack != nil) [invocationStack release]; // allocate new invocation stack invocationStack = [[NSMutableArray alloc] initWithCapacity: blockCount]; // populate invocation stack for (i = 0; i < blockCount; i++) { rangeWrapper = [NSValue valueWithRange: subrange]; invocation = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector(drawBlockOfLines:)]]; [invocation setTarget: self]; [invocation setSelector: @selector(drawBlockOfLines:)]; [invocation setArgument: &rangeWrapper atIndex: 3]; [invocationStack addObject: invocation]; subrange.location += DRAW_LINES_BLOCK_SIZE; if (i == maxBlockIndex) subrange.length = leftovers; } [super setFrame: inRect]; // may need a [self setNeedsDisplay: YES] here, not sure... } // in your drawRect method - (void) drawRect:(NSRect) inRect { // pop an invocation off the stack and run it NSInvocation *invocation = [[invocationStack objectAtIndex: 0] retain]; [invocationStack removeObjectAtIndex: 0]; [invocation invoke]; [invocation release]; // schedule the next round of drawing [NSTimer scheduledTimerWithTimeInterval: DRAW_LINES_BLOCK_DELAY target: self selector: @selector(drawRect:) userInfo: nil repeats: NO]; } - (void) drawBlockOfLines:(NSValue *) inRange { NSRange range = [inRange rangeValue]; // do your drawing here } On Jun 20, 2011, at 3:49 AM, Matthias Arndt wrote: > Hi Graham, hi Uli, > > guys, you're gems! Thanks for all the input. Currently it's too early to dive > into some high sophisticated optimization, and with Graham's info I'm > confident the view's back buffer will work for me. > > Am 20. Jun 2011 um 08:59 schrieb Graham Cox <graham....@bigpond.com>: > >> The view is already doing this for you. Everything drawn in a view actually >> ends up in a bitmap - the window's back buffer. If you draw a subrange of >> your objects, the ones you've earlier drawn into the back buffer are still >> there. The only time you have to start over is when the view resizes, which >> is what the 'needsErase' flag is for in my example - the back buffer gets >> cleared effectively clearing your "cache". There's no reason to reinvent the >> drawing mechanism from scratch, it's just a duplication of effort. > > Hopefully I find some time these days to implement more details of the > animation based on NSTimer-triggered redraws: Currently it's only quick & > dirty, but seems to do the trick. I'll keep you posted. > > Thanks again, Mattes > _______________________________________________ > > Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) > > Please do not post admin requests or moderator comments to the list. > Contact the moderators at cocoa-dev-admins(at)lists.apple.com > > Help/Unsubscribe/Update your Subscription: > http://lists.apple.com/mailman/options/cocoa-dev/kentozier%40comcast.net > > This email sent to kentoz...@comcast.net _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com