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, jonat...@mugginsoft.com 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 (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

Reply via email to