2
\$\begingroup\$

Ive been working on a prototype for client side prediction in multiplayer games, Ive managed to make it work but for some reason the prediction breaks when the latency fluctuates.

For example if I have a constant 200ms latency, client side prediction works just fine, but it starts doing weird things when latency fluctuates, first I tought it may have to do with packages arriving out of order (packets have an ID) but discarding duplicates / out of order packets didnt really change anything.

The purple point represents the position received from the server and the yellow one the predicted position based on the one received + all non processed inputs.

Client Moving with constant 400ms latency: 400ms constant

Client Moving with only 200ms latency (but fluctuates +-25ms): enter image description here

Code for the client movement (prediction, called every frame):

private void Predict(float delta)
{
    instruction_count++;
    byte instruction = PlayerMovement.ReadInput();
    network.SendClientMovementInstructions(instruction_count, instruction);

    instructions.Add(new Instruction{tick = instruction_count, data = instruction});
    
    Position += PlayerMovement.Movement(instruction, delta);
}

Code for the reconciliation (this is called when a package arrives from the server):

private void Reconciliate(int tick, Vector2 received_position)
{
    Vector2 prediction = received_position;

    foreach(var entry in instructions)
        if (entry.tick >= tick)
            prediction += PlayerMovement.Movement(entry.data, 1.0f / 60.0f);

    instructions.RemoveAll(i => (i.tick < tick));

    //i dont use it here but if this goes past certain threshold we snap back the client to were it should be.
    float deviation = (prediction - Position).Length();

}
\$\endgroup\$

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.