Re: Coalesced updates and refresh rate
Re: Coalesced updates and refresh rate
- Subject: Re: Coalesced updates and refresh rate
- From: Ken Thomases <email@hidden>
- Date: Wed, 15 Jun 2011 10:02:19 -0500
On Jun 15, 2011, at 8:42 AM, Wolfgang Kundrus wrote:
> That aside, I am trying to understand, why Cocoa does not flush the
> graphics, if there has been drawn something to the window with the a method
> that works well otherwise. I understand coalescing updates and I want to
> stay away from CGContextFlush as this would cause the application to block,
> if another flush has to happen.
I generally agree with Graham that you shouldn't be drawing from a secondary thread. I doubt you're actually achieving anything that couldn't be achieved better on the main thread using the normal display mechanism.
All of that said, the Threading Programming Guide <http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html> has this to say about NSGraphicsContext:
> If you do any drawing from a secondary thread, you must flush your drawing calls manually. Cocoa does not automatically update views with content drawn from secondary threads, so you need to call the flushGraphics method of NSGraphicsContext when you finish your drawing. If your application draws content from the main thread only, you do not need to flush your drawing calls.
You would have to obtain the appropriate graphics context by calling +[NSGraphicsContext currentContext] while the focus is locked. Maybe, but not certainly, it would be same context as that returned by -[NSWindow graphicsContext] outside of focus lock on that same thread. I'd be surprised, though, if -[NSGraphicsContext flushGraphics] were not, in the end, a wrapper around CGContextFlush or CGContextSynchronize.
You said earlier that:
> We have to update a lot of small onscreen objects and performance is way better, when we travers them outside the Cocoa view tree.
However, the "performance" isn't _actually_ better if the drawing isn't flushed to screen except for once a second. And it's also not better if you have to use CGContextFlush and that throttles you to one update per screen refresh.
So, I think you're dealing in a fantasy. You're looking at performance that only exists so long as the drawing isn't actually happening. Well, of course that will be faster than the code that actually works. Chances are that, even if you had your ideal mechanism for causing the window context to be flushed once per frame (as opposed to once per lock-unlock of focus on a view), it would probably be no faster than when done via -setNeedsDisplay.../-displayIfNeeded/-drawRect: on the main thread.
Regards,
Ken
_______________________________________________
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