John Carmack has a tweet:
"Triple buffering adds latency and jitter; it should be avoided. The Answer is non-isochronous display updates."
Can anyone explain what he meant by adds latency and jitter?
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It only takes a minute to sign up.Sign up to join this community
I have an idea of where the jittering comes from with vSync and triple buffering. The easiest way to show this is visually.
The first example would be 30fps with a 60hz refresh rate vSynced with Double buffering. The pipes are new frames and periods are duplicated frames.
This gives an even ~33ms between each new frame, which makes it appear smooth (for 30 fps anyway). You can see how fitting 60fps into the same situation fits perfectly into the timing interval, allowing for a new frame every refresh.
Now, lets see how it would look running 45fps at a 60hz refresh rate vSynced with Triple Buffering:
You can see here that there is an uneven interval between frames. In this case, the frame times are 16,16,16,33,16,16,16,33. Since the monitor only updates once every ~16ms, if a new frame isn't ready for a particular update, it still has to wait a whole additional ~16ms, even if its ready 1-2ms after the previous update.
However, I think the whole TB situation is still debateable and depends on the situation. Personally, I'd rather see 55fps with no tearing with occasional dropped frames than to go all the way down to 30fps to get even frame timing.
As a side note, this is a good example of how a 120hz monitor can increase smoothness of a game running at ~45fps since there is a higher frequency of times that a new frame can be displayed to the screen.
It adds latency because you've got 3 buffers involved instead of 2, so it takes one more frame for your rendered image to get to the screen.
I have no idea what kind of "jitter" Carmack is talking about here, though.
Maybe, just maybe, this could make sense in a highly variable framerate context: frames rendered with a given delta-time but displayed later with a different delta, resulting in a visible jitter?