#1 Members - Reputation: 292
Posted 18 August 2012 - 09:19 AM
Searching the forum, I found this old topic, but that suggests I need to reset things to switch VSync. Doing this takes some time, is that correct? Or can that be done at any time in between two frames without causing a framedrop because of the reset?
I know that quite a few games these days have VSync on by default and then dynamically shortly turn if off if the framerate drops too far. When the framerate is back to normal, vsync is then turned on again. How is this done on PC in DirectX9? Or is this only done on consoles?
Ronimo Games (my game dev company)
Awesomenauts (2D MOBA for PC/XBLA/PSN)
Swords & Soldiers (2D RTS for Wii/PS3/PC/Mac/iOS/Android/Linux)
Proun (abstract racing game for PC)
#2 Moderators - Reputation: 5652
Posted 18 August 2012 - 11:48 AM
Edited by MJP, 18 August 2012 - 11:49 AM.
#3 Members - Reputation: 2010
Posted 18 August 2012 - 12:18 PM
You could also create a DirectDraw device that you use only for VSync. Check out WaitForVerticalBlank, http://msdn.microsof...y/aa911354.aspx or GetVerticalBlankStatus.
Edited by Erik Rufelt, 18 August 2012 - 12:20 PM.
#4 Members - Reputation: 292
Posted 20 August 2012 - 01:18 AM
Kind of funny how some features are impossible in one API, and no problem in another. Same OS, same hardware, but DirectX 9 can't do it and OpenGL can. Guess DX10/11 do have some useful improvements after all.
Thanks for the help, folks!
Edited by Oogst, 20 August 2012 - 01:19 AM.
Ronimo Games (my game dev company)
Awesomenauts (2D MOBA for PC/XBLA/PSN)
Swords & Soldiers (2D RTS for Wii/PS3/PC/Mac/iOS/Android/Linux)
Proun (abstract racing game for PC)
#5 Moderators - Reputation: 14305
Posted 20 August 2012 - 01:27 AM
Does DX11 have a GPU timestamp read-back API, and a requirement for GPUs to support it? DX9 is lacking this, and GL has it via an extension (not sure which GPUs do and don't support the extension though).However even with that it's still difficult do a soft VSYNC, since you don't have the same amount of low-level timing info and control that you do on consoles.
Being able to stamp your frames to get a value on GPU processing time would be a great base-level API requirement (like on consoles). Even if read-back is delayed, you can use a rolling average to get yourself out of trouble a few frames after vsync starts being consistently harmful.
#6 Members - Reputation: 292
Posted 20 August 2012 - 01:53 AM
Doesn't DirectX have some equivalent of OpenGL's fences? Fences are not exactly what you describe, but they do give some nice information on where the videocard is at the moment.Does DX11 have a GPU timestamp read-back API, and a requirement for GPUs to support it? DX9 is lacking this, and GL has it via an extension (not sure which GPUs do and don't support the extension though).
Being able to stamp your frames to get a value on GPU processing time would be a great base-level API requirement (like on consoles). Even if read-back is delayed, you can use a rolling average to get yourself out of trouble a few frames after vsync starts being consistently harmful.
Edited by Oogst, 20 August 2012 - 01:55 AM.
Ronimo Games (my game dev company)
Awesomenauts (2D MOBA for PC/XBLA/PSN)
Swords & Soldiers (2D RTS for Wii/PS3/PC/Mac/iOS/Android/Linux)
Proun (abstract racing game for PC)
#8 Moderators - Reputation: 14305
Posted 20 August 2012 - 02:30 AM
You've just blown my mind!There are timestamp queries, which are actually available in DX9 as well.
I swear that last time I looked at the local version of this page (inside the DirectX SDK's installed documentation), there was no timestamp query.
I was still under the impression that the only method of timing GPU usage under DX9 was the non-real-time, CPU-blocking, flush & finish method described here.
On consoles, I basically use a ring-buffer of time-stamp queries to detect bad performance; the major check is using the deltas to calculate a rolling average of GPU-frame-time to see if there's consistently bad GPU performance. It seems I can implement this on DX9 as well?
#9 Moderators - Reputation: 5652
Posted 20 August 2012 - 12:44 PM
You've just blown my mind!
There are timestamp queries, which are actually available in DX9 as well.
I swear that last time I looked at the local version of this page (inside the DirectX SDK's installed documentation), there was no timestamp query.
I was still under the impression that the only method of timing GPU usage under DX9 was the non-real-time, CPU-blocking, flush & finish method described here.
On consoles, I basically use a ring-buffer of time-stamp queries to detect bad performance; the major check is using the deltas to calculate a rolling average of GPU-frame-time to see if there's consistently bad GPU performance. It seems I can implement this on DX9 as well?
Yeah I had thought they were new for DX10, but someone else pointed out to me that DX9 has them as well. In my experience the query works pretty much the way you'd expect. Which of course means it has all of the usual latency problems with queries, as well as the "just what exactly am I measuring?" problem you have with reading GPU timestamps.
Edited by MJP, 20 August 2012 - 12:45 PM.






