Hey all,
So I’m implementing multiplayer movement of other characters in my game now, I have the server getting new players logging in and storing them in a local copy of the player. My question now is how to do the movement updating. I know how to do it, just create a packet and send it over the server to everyone to update. But, I don’t want to be sending a huge number of packets every second for every player. That just seems like it will overload my server and crash.
My question to you all is: how could I go about doing this efficiently?
I’m posting a snippet of my movement code below:
public void updatePlayer(int delta)
{
boolean isWalking = false;
float xChange = 0, yChange = 0;
Input input = gc.getInput();
int runMod = 1;
if (input.isKeyDown(Input.KEY_LSHIFT))
{
runMod = 2;
}
if(input.isKeyDown(Input.KEY_A))
{
//LEFT
sprite = walkingAnimLeft;
sprite.start();
xChange -= speed * runMod * delta;
isWalking = true;
facing = "left";
}
if(input.isKeyDown(Input.KEY_D))
{
//RIGHT
sprite = walkingAnimRight;
sprite.start();
xChange += speed * runMod * delta;
isWalking = true;
facing = "right";
}
if(input.isKeyDown(Input.KEY_W))
{
//UP
sprite = walkingAnimUp;
sprite.start();
yChange -= speed * runMod * delta;
isWalking = true;
facing = "up";
}
if(input.isKeyDown(Input.KEY_S))
{
//DOWN
sprite = walkingAnimDown;
sprite.start();
yChange += speed * runMod * delta;
isWalking = true;
facing = "down";
}
if (input.isKeyPressed(input.KEY_ENTER))
{
if (chat.isChatting())
{
chat.sendText();
}
else
{
chat.setChatting(true);
}
//chat.setChatting();
}
if(input.isKeyPressed(input.KEY_E))
{
toggleEquip();
}
//If the player is not walking, stop the animation
if (isWalking && !currentMap.blocked(x+xChange, y+yChange, facing))
{
x += xChange;
y += yChange;
//Here's where I would put it, but as you can see updatePlayer is called all the time, so I'd be sending a packet all the time for each player.
}
if (!isWalking)
{
sprite.setCurrentFrame(1);
sprite.stop();
}
isWalking = false;
}
I was thinking of using some sort of timer and basically lumping the movements into one packet. I.e., aggregating movement updates across X milliseconds into one packet and sending those at once. But this would require a timer of some sort to count every, 20 milliseconds, let’s say. The problem there is, I would need the timer to be accurate on each and every client. And no, I haven’t just tried sending it every update, because I’m scared of it crashing hardcore.
Any advice?

Back on topic though, KryoNet does have some limitations, mostly with threading. KryoNet is limited to one network thread. Objects are serialized on any thread that calls send() and bytes are usually sent immediately from that thread, though they may be queued for sending later from the network thread. That part is fine, but bytes are always received and queued on the network thread, and deserialization happens on that thread as well. Once you get the deserialized object you can process it on another thread, but doing the deserialization on the network thread limits throughput. This starts to become an issue when exceeding 1Gbit/s.
But after reading all this I’m gonna keep trying what I’m doing until I notice some issues.