• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Core Animation vs. Basic Cocoa Graphics
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Core Animation vs. Basic Cocoa Graphics


  • Subject: Re: Core Animation vs. Basic Cocoa Graphics
  • From: "Mazen M. Abdel-Rahman" <email@hidden>
  • Date: Thu, 11 Mar 2010 19:13:01 -0700

Thanks everyone for your help on this.

I started using an image cache - but that did not improve the performance as much as I thought it should.  I then removed the section of my code that creates NSTrackingsAreas - and the improvement was immediately noticeable.

For the calendar grid I was creating an NSTrackingArea for each cell - in my case (the calendar is for 7 days with 15 minutes per cell) there was 672 NSTrackingAreas.

I will have to look at alternative solutions to all these NSTrackingAreas to improve the performance.

Thanks,
Mazen


On Mar 11, 2010, at 2:44 AM, email@hidden wrote:

>
>
> On 10 Mar 2010, at 17:13, Mazen M. Abdel-Rahman wrote:
>
>> Hi All,
>>
>> I was able to write a simple calendar view that uses basic cocoa graphics to draw directly on the view (NSBezierPath, etc.).  I actually use several different paths for drawing the calendar (it's a weekly calendar) to allow different horizontal line widths (hour, half hour, etc.).  The calendar view is inside a scroll view - and is actually about 3 times longer than the view window.   The main problem is that the scrolling is not smooth - and my assumption is that it's because the NSBezier stroke functions  have to be constantly called to render the calendar.
>>
>> For something as relatively simple as this would moving to core animation - i.e. trying to render the calendar on a layer instead (I am still trying to learn core animation) add performance benefits?  And would it allow for smoother scrolling?
>>
> As no one else has offered an opinion:
>
> Moving to CA might offer benefits but you can improve the performance of your existing code by using an image cache.
> I do this for an NSView with animated NSBezierPath content and it works fine.
>
> So I would draw my image when the view resizes and there after service - (void)drawRect:(NSRect)rect from the image cache.
> You only regen the cache when required, say on resize on content change.
>
> The rough code outline below might help you get something up an running:
>
> NSView subclass:
>
> ivars:
>
> NSRect _cacheRect;
> NSImage *_imageCache;
> BOOL _useImageCache;
>
> - (void)drawRect:(NSRect)rect
> {
>
> 	if (_useImageCache) {
>
> 		// validate our rect
> 		rect = [self validateDrawRect:rect];
>
> 		// if cache exists use it to update rect.
> 		// otherwise draw into our rect
> 		if (_imageCache) {
> 			[self drawRectFromCache:rect];
> 			return;
> 		}
>
> 		// draw to image cache
> 		_cacheRect  = [self bounds];
> 		_imageCache = [[NSImage alloc] initWithSize:_cacheRect.size];
> 		[_imageCache lockFocus];
>
> 	}
>
> 	// draw entire bounds rect
> 	rect = [self bounds];
>
> 	// draw it
> 	NSBezierPath *bgPath = [NSBezierPath bezierPathWithRect:rect];
> 	NSColor *endColor = [NSColor colorWithCalibratedRed:0.988f green:0.988f blue:0.988f alpha:1.0f];
> 	NSColor *startColor = [NSColor colorWithCalibratedRed:0.875f green:0.875f blue:0.875f alpha:1.0f];
>
> 	NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor];
> 	[gradient drawInBezierPath:bgPath angle:90.0f];
>
>
> 	if (_useImageCache) {
> 		[_imageCache unlockFocus];
>
> 		// refresh view from cache
> 		[self drawRectFromCache:rect];
> 	}
>
> }
>
> /*
>
> draw rect from cache
>
> */
> - (void)drawRectFromCache:(NSRect)rect
> {
> 	[_imageCache drawInRect:rect fromRect:rect operation:NSCompositeSourceOver fraction:1.0f];
> }
> /*
>
> validate the draw rect
>
> */
> - (NSRect)validateDrawRect:(NSRect)rect
> {
> 	NSRect boundsRect = [self bounds];
>
> 	// if bounds rect and cache rect are not equal then
> 	// the cache will have to be updated
> 	if (!NSEqualRects(boundsRect, _cacheRect)) {
> 		[self clearDisplayCache];
> 	}
>
> 	// if no display cache available then need to draw bounds into cache
> 	if (!_imageCache) {
> 		rect = boundsRect;
> 	}
>
> 	return rect;
> }
>
> Regards
>
> Jonathan Mitchell
>
> Developer
> http://www.mugginsoft.com
>

_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Core Animation vs. Basic Cocoa Graphics
      • From: Thomas Engelmeier <email@hidden>
    • Re: Core Animation vs. Basic Cocoa Graphics
      • From: Alvaro Costa Neto <email@hidden>
References: 
 >Core Animation vs. Basic Cocoa Graphics (From: "Mazen M. Abdel-Rahman" <email@hidden>)
 >Re: Core Animation vs. Basic Cocoa Graphics (From: "email@hidden" <email@hidden>)

  • Prev by Date: Re: Switching methods in private classes in Apple frameworks
  • Next by Date: Re: View does not get refreshed after Window deminimized...
  • Previous by thread: Re: Core Animation vs. Basic Cocoa Graphics
  • Next by thread: Re: Core Animation vs. Basic Cocoa Graphics
  • Index(es):
    • Date
    • Thread