Re: Throttling drawing to vertical refresh
Re: Throttling drawing to vertical refresh
- Subject: Re: Throttling drawing to vertical refresh
- From: Andreas Falkenhahn via Cocoa-dev <email@hidden>
- Date: Fri, 23 Oct 2020 18:19:50 +0200
Erm, but I obviously need to update the screen more often than every second. I
don't understand why I should be using an update time of 1 second. I obviously
need to call "setNeedsDisplay" more often than that...
On 23.10.2020 at 18:09 Alex Zavatone wrote:
> Naaah, it’s not that. The OSes draw code already handles that at a
> much lower level. You’re just creating what is a maximum update
> throttle. You’re not blitting pixels in a video card driver.
> You can try my simple approach and just declare the next update
> time to be the current time + 1 second. It should work without screen
> flicker at all.
> We’re not doing low level code. As far as i know, the MacOS code
> has a triple buffered system that already handles that.
>> On Oct 23, 2020, at 10:51 AM, Andreas Falkenhahn <email@hidden>
>> wrote:
>> The problem with that approach is that I'd need to find out the monitor's
>> refresh rate in order to calculate "nextUpdateTime" and I'm not sure if I
>> can get this information from all monitors reliably.
>> On 19.10.2020 at 00:09 Alex Zavatone wrote:
>>> It shouldn’t be too hard to roll your own simply based on milliseconds of a
>>> timer.
>>> Even a simple
>> if (myMilliseconds >> nextUpdateTime) {
>>> [updateObject doThatUpdate];
>>> nextUpdateTime = myMilliseconds + msThrottle;
>>> }
>>> lets you get a basic throttle.
>>> Cheers,
>>> Alex Zavatone
>>>> On Oct 15, 2020, at 2:13 PM, Andreas Falkenhahn via Cocoa-dev
>>>> <email@hidden> wrote:
>>>> I'm drawing inside an NSView by simply setting its layer's contents to a
>>>> CGImage which is updated for every frame, e.g. something like this:
>>>> dp = CGDataProviderCreateWithData(NULL, frameBuf, frameBufSize, NULL);
>>>> im = CGImageCreate(frameWidth, frameHeight, 8, 32, frameStride,
>>>> theColorSpace, (CGBitmapInfo) kCGImageAlphaNoneSkipFirst, dp, NULL, FALSE,
>>>> kCGRenderingIntentDefault);
>>>> view.layer.contents = (id) im;
>>>> CGImageRelease(im);
>>>> CGDataProviderRelease(dp);
>>>> This works fine except that there is no throttle so this will draw as fast
>>>> as the CPU allows, which of course is a waste of CPU cycles because the
>>>> monitor only refreshes a certain amount of times per second.
>>>> So is there a convenient way to throttle drawing to the monitor's refresh
>>>> rate or does this have to be done the hard way by querying the monitor's
>>>> refresh rate and then setting up a timer which draws in exactly those
>>>> refresh intervals or how should this be done?
>>>> Note that I'd like to avoid using OpenGL or Metal or whatever is the
>>>> standard nowadays but I'm mainly interested in an AppKit solution...
>>>> --
>>>> Best regards,
>>>> Andreas Falkenhahn mailto:email@hidden
>>>> _______________________________________________
>>>> 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
>> --
>> Best regards,
>> Andreas Falkenhahn mailto:email@hidden
--
Best regards,
Andreas Falkenhahn mailto:email@hidden
_______________________________________________
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