It has to. You don't want the CPU and the GPU to be working on the same frame, so you have to have a double (or more)-buffering scenario between the CPU and GPU just like you do between the GPU and monitor. Here's basically want you want:
Every time the GPU finishes a frame, there should be a frame from the CPU ready to render. So, the driver needs a buffer of frame data to be sent to the GPU. Additionally, when the CPU is done with its work, it wants to have an empty buffer of data so that it can continue working on the next frame.
Thus, for smooth operation, you want to have:
1) The frame the GPU is working on
2) The frame waiting to be sent to the GPU
3) The frame the CPU just finished
4) The frame the CPU is currently working on
If you examine this, then you should notice that the situation I posted above really is an optimal situation, when buffer (3) is perpetually empty. But, also keep in mind that the situation I posted was 33 fps, which is on the low edge of interactive framerates. Good framerates obviously include lower latencies.
As a side comment, a classic situation where this particular way of rendering became horribly noticeable was with the original Unreal. One of the problems with the original Unreal, early-on, was that some Direct3D drivers produced in the game what was reported as "mouse lag," which was really just too many frames being buffered before rendering, which resulted in a very noticeable lag between input and display. DirectX has set limits on the number of frames displayed, which I seem to recall is in the range of 5-6, hence my previous statement.
With this said, what you should notice is that if the framerate is low, you really want to have as little latency as possible, and thus fewer frames cached. But if the framerate is high, it becomes very desireable to have more frames cached so that the framerate stays high.
And lastly, do not forget that the ping seen in online multiplayer games really isn't a good indication of what sort of latency is noticeable to us, since bandwidth is also a significant factor.
Every time the GPU finishes a frame, there should be a frame from the CPU ready to render. So, the driver needs a buffer of frame data to be sent to the GPU. Additionally, when the CPU is done with its work, it wants to have an empty buffer of data so that it can continue working on the next frame.
Thus, for smooth operation, you want to have:
1) The frame the GPU is working on
2) The frame waiting to be sent to the GPU
3) The frame the CPU just finished
4) The frame the CPU is currently working on
If you examine this, then you should notice that the situation I posted above really is an optimal situation, when buffer (3) is perpetually empty. But, also keep in mind that the situation I posted was 33 fps, which is on the low edge of interactive framerates. Good framerates obviously include lower latencies.
As a side comment, a classic situation where this particular way of rendering became horribly noticeable was with the original Unreal. One of the problems with the original Unreal, early-on, was that some Direct3D drivers produced in the game what was reported as "mouse lag," which was really just too many frames being buffered before rendering, which resulted in a very noticeable lag between input and display. DirectX has set limits on the number of frames displayed, which I seem to recall is in the range of 5-6, hence my previous statement.
With this said, what you should notice is that if the framerate is low, you really want to have as little latency as possible, and thus fewer frames cached. But if the framerate is high, it becomes very desireable to have more frames cached so that the framerate stays high.
And lastly, do not forget that the ping seen in online multiplayer games really isn't a good indication of what sort of latency is noticeable to us, since bandwidth is also a significant factor.