@Furious-Witch You’ll need to interpolate positions on the client, it’s unavoidable generally. Some games synchronize 20 hz, some as low as 6-10. Even at 20, if the client is running at 30 or 60 fps you’ll notice a smoothness issue without interpolation.
I’m still a little curious about the overall bandwidth use here. A vector 3 payload should look roughly like this on the wire for size (Assuming no gathering happens to reduce the traffic before it’s sent):
Worst case (1 message per packet) if the packet is unreliable:
8 bytes UDP header + 20 bytes IPv4 header + 10 bytes UNet headers + 12 bytes Vector3 = 50 bytes each vector update
Worst case (1 message per packet) if the packet is fragmented reliable:
8 bytes UDP header + 20 bytes IPv4 header + 22 bytes UNet headers + 12 bytes Vector3 = 62 bytes each vector update
And that means the per second cost is:
Unreliable:
50 bytes * 20hz = 1000 bytes per second
50 bytes * 5hz = 250 bytes per second
Reliable (excluding retransmits):
62 bytes * 20hz = 1240 bytes per second
62 bytes * 5hz = 310 bytes per second
So something here doesn’t quite add up still. Even when synchronizing at 20hz you should be well within the bandwidth limit in your test.
In any event the bandwidth limit does scale with number of clients connected, so as you add clients each will be able to digest 4k down from the server.
As for reliable vs unreliable, yes reliable is not always optimal for movement because even if you drop packets you cant really rewind time to insert missing positions if you would have already used them, it’s best to just handle the most recent movement packet as it comes in and wait for the next newer one to arrive.
If you’re always sending out the packets and not checking for their dirty state i’d recommend sending unreliable. If you DO check for position differences however you’ll need to use reliable. This is because if you don’t send packets out because nothing has changed, and the most recent movement packet you sent was dropped, the object’s position will be incorrect on the remote client since it never received that last position. In effect if the code is only sending when changes occur and the network layer is not resending dropped packets you run the risk of object being at the wrong position permanently (or until another change occurs and a packet is successfully received), if that makes sense.