I'm mostly talking about the single delays like you outlined. I'll call these latency spikes. These could be either FPS drops on the client or actual latency on the network.
I think I'll implement the clock syncing because it will probably make things easier. But I don't really understand the roll of the buffer anymore when using clock syncing. Do I get rid of it?
With clock syncing though, what happens also during latency spikes? Doesn't the server go to grab a user command during a tick and it's not there? Won't this also fill up the buffer?
Maybe pseudo code would help me understand?
Here is how it works currently for me:
Tick loop (at 60hz) on client:
Generate usercommand by polling input. User command is tagged with current client tick.
Send usercommand to be client side predicted
Send usercommand over network (Which waits until 2 are available and sends then).
Tick loop at(60hz) on server:
Once per render frame (higher than ticks) check for any incoming usercommand message. If any add to the players user command buffer
Per tick check for the lowest client tick if there are any and apply it to that player.
Both loops can play catchup