I am programming a multiplayer game and I am concerned about the bandwidth dedicated to player movement. Imagine a 2D top down game where players can move towards any angle using the joystick. The way I do it currently is to round directional vectors to the nearest 0.25 and send a new movement packet when the vector is different. (meaning a player moves into a different direction) Rounding to nearest 0.25 provides a fairly good approximation and the position is synchronized on every new movement packet because these packets contain the new x,y of the player.
This scheme works well for keyboard controls because this directional vector changes a lot less often than with a joystick. However, when a joystick is rotated quickly, this ups the bps up to around 500 bytes per second. Imagine 100 players packed together in a map, where everyone is quickly moving around using the joystick: 500 bps per player becomes 50000 bps because it has to be sent to every other players. Multiply this by 100 for each players, and you have about 5 megabytes of just movement packets being transferred every second.
Is there any way I can do more prediction on the client and greatly reduce bandwidth?