Re: High Level Toolkit -- is it obsolete or not?
Re: High Level Toolkit -- is it obsolete or not?
- Subject: Re: High Level Toolkit -- is it obsolete or not?
- From: Joel May <email@hidden>
- Date: Fri, 26 Feb 2010 08:30:26 -0600
Nick,
I'm using [NSView setNeedsDisplayInRect: r] and [NSView drawRect: r], so I'm not explicitly flushing and that's not goofing things up. Beam-sync is related to flushing, I think. I don't know how to turn it on or off programmatically and it does not appear in QuartzDebug -- I think it was removed in Snow Leopard or the newest XCode. It might be renamed to AutoFlush drawing.
However, I've found that I was not using the right CG function: I was using CGContextDrawTiledImage()
and should have been using CGContextDrawImage(). In my early testing I came to the mis-conclusion that CGContextDrawTiledImage() was faster. It is actually about twice as slow. I was jumping between machines and not being methodical about my testing.
I've redone speed tests and now if I don't stretch the window, the screen update is fine on my new iMac. If I do stretch to full screen, CGContextDrawImage() takes about 80 ms and CGContextDrawTiledImage() takes about 140ms.
Then I turned on QuartzGL (which I had never heard of until your email, thanks) with
HIWindowSetBackingLocation(windowRef, kHIWindowBackingLocationVideoMemory).
Now, CGContextDrawImage() takes 4ms or less to update the entire screen. This is beautiful.
I still need to test on my Tiger, PPC mac. I'm thinking screen updates with Quartz will be a problem there, but I don't know yet. I might have to use a separate executable with QuickDraw. I use copybits in my own dirty rectangle handling in Carbon code. [NSView drawRect: r] seems to coalesce all the dirty rectangles into one big rectangle that also contains a lot of area that is not dirty. My old code has smaller, non-overlapping dirty rectangles updated with copybits which should be more efficient.
Conclusion:
* Quartz is actually sufficiently speedy to update the screen, at least on a new mac.
* QuartzGL is great, esp when stretching the image.
* Not sure about Tiger (no QuartzGL) or older machines yet. Might need to stay with QuickDraw/copybits.
Thanks for your help. I would have wasted a lot of time with CoreAnimation, which I don't need for this project.
Joel
On Feb 23, 2010, at 5:50 PM, Nick Zitzmann wrote:
>
> On Feb 23, 2010, at 4:35 PM, Joel May wrote:
>
>> Thanks for the info about drawing in a different thread. I won't waste my time and sanity. I guess I need to figure out how to speed up the drawing instead and keep it in the main thread.
>
> How often does your app flush its changes? If it's more than 30 f/s, then you're wasting redraws, and either need to disable beam sync, or cut back on the animation. You can use Quartz Debug to find out, and control the beam sync feature.
>
> Did you also try QuartzGL? It didn't work correctly in Tiger, and it's off by default in Leopard & Snow Leopard, but it ought to work on most Macs. Again, you can experiment with this using Quartz Debug.
>
> Nick Zitzmann
> <http://www.chronosnet.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