Hi Mazen, how are you?

Maybe I can offer a tip on how to improve your performance: there is a 
technique called  BSP-Tree which divides the space in two equal parts 
recursively, creating a tree of subdivisions. This technique improves the 
search of which area of the space (in your case, the view) that a point is 
located by constructing and traversing the binary tree. It's really neat!

As for the actual implementation, I am very new to the Cocoa framework and the 
Objective-C language and I wouldn't be of much help with it. Maybe someone else 
who is more experienced on the Mac ways of programming may be of more use to 
you than me.

Hope that helps.

Best regards,
Alvaro Costa Neto

On Mar 11, 2010, at 11:13 PM, Mazen M. Abdel-Rahman wrote:

> 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/nepheus.br%40gmail.com
> 
> This email sent to nepheus...@gmail.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