External framerate caps adds lag. Use in-game framerate cap.
Posted: 27 May 2014, 23:33
I made a post on another forum that got good acclaim, so I'm crossposting here:
Chief Blur Buster wrote:Actually, it is kind of a law of physics limitation of sorts, rather than as a bug.CoD511 wrote:Personally, I know about the issue and I'd call it an unfixed issue or a bug despite. It's unintended behaviour occurring on their part, that's just what a bug is (or the result of something causing that behaviour) with or without technicality involved. Regardless if a user does a workaround by capping the framerate below the refresh rate per game when possible.
There is no easy workaround other than reinventing the 3D rendering paradigm to permit easy driver/hardware-side lagless framerate capping which is otherwise not easily possible.
Frames should be throttled right before input reads, and BEFORE rendering, not after already rendering, which is what external framerate limiters do (e.g. NVInspector, driver capping, VSYNC ON capping, GSYNC limit hitting). You have lost the lag battle if you already rendered the frame and then is forced to wait on presenting the frame. Game developers need to allow an internal method of frame rate capping, for full control over lag, without being forced to wait by external limiters after presenting the frame.
- External framerate limiters of any kind adds lag in current 3D architectures.
- Internal framerate limiters can successfully avoid this lag.
Only the appearance of the lag at, say, fps_max 143 (during 144Hz GSYNC) can legimately be called a potential issue. It can be improved so that there is no lag penalty when you use an in-game framerate limiter closer to Hz. But once an external limit is hit -- you yield game engine control of lag -- when something outside your game forces frames to wait.
However, new Microsoft and OpenGL APIs could theoretically be made to help assist game developers in making easy, more automatic "Just in Time VSYNC" (ultra low latency VSYNC ON by timing the rendering right before VSYNC). Likewise, hardware can work to reduce the pain of this unavoidable law-of-physics effect, such as in the future, the GSYNC limit can be raised (e.g. 240fps@240Hz) so when the limit hits, the lag penalty becomes so small. So engineering solutions exist over the long term, but isn't as simple as an in-game framerate limiter.
Did you know 8bit Nintendo games and arcade games such as Street Fighter was always VSYNC ON? We never complained about lag. The VSYNC ON only became evil for lag when the 3D accelerator / GPUs arrived, and their framebuffered architecture enforced a mandatory minimum lag from the framebuffering of 3D graphics.
TL;DR: Sudden lag increases when an external limiter of ANY kind is hit, is not a bug but a law of physics issue for current rendering architectures. This sort of thing requires creative game-developer-side programming to overcome. External framerate limiters force lag, no matter the tech. For now, game developers MUST proactively work this. Easiest way is simply to add an ability to set a configurable internal framerate limiter, similiar to Source Engine's fps_max command.