Você precisa apenas de 30 atualizações (ou menos, talvez 10 ou 20) por segundo. interpolar as posições dos objetos em movimento do lado do cliente. Em geral, você só deve enviar dados quando for realmente necessário. No WoW, você pode receber mais atualizações dos jogadores com quem está em um grupo do que dos jogadores que estão no mesmo local. Além disso, se outro jogador estiver longe de você, você não receberá tantas atualizações por segundo sobre ele.
Em seguida, envie apenas um instantâneo completo para cada jogador quando ele se conectar. Depois disso, envie apenas as alterações dos objetos do jogo. Se nenhuma alteração ocorreu, não a envie.
Em seguida, faça uso intenso de BitVectors ou, no entanto, você poderá chamá-los para reduzir a quantidade de dados desnecessários! Exemplo: Você também pode tentar escrever um float usando apenas um byte (em um intervalo de 0 a 1 ou -1 a 1) para ter apenas 256 ou 128 valores diferentes. Mas o jogador não notará movimentos bruscos graças às interpolações.
Veja aqui um exemplo com a LidgrenLibrary sobre como compactar dados: http://code.google.com/p/lidgren-network-gen3/wiki/Optimization
Próximo: Tente reduzir o raio de visão dos jogadores à medida que eles se movem e transmitir apenas informações importantes nesse período. Então, quando eles pararem, aumente o raio de visão novamente. Você pode usar um sistema de hash espacial ou uma árvore bsp para reduzir a sobrecarga de procurar objetos que estão "dentro do alcance". Esta é uma boa leitura para o tópico: http://en.wikipedia.org/wiki/Collision_detection
Comprima também os dados, VOCÊ MESMO, VOCÊ CONHECE a estrutura dos dados e a coerência temporal nos dados (que podem e devem ser explorados). Um algoritmo geral como Bzip2, Deflate, qualquer que seja, deve ser usado, mas apenas como o estágio final da compactação!
Além disso, para informações não críticas ao jogo, você também pode empregar técnicas P2P adicionais. Exemplo: Um jogador reproduz a animação "Olá". (Apenas um efeito gráfico) O jogador envia essas informações para o servidor, mas o servidor não retransmite as informações para os outros jogadores. Em vez disso, esse efeito não crítico é enviado pelo próprio jogador para os outros clientes no intervalo.
EDIT (por causa do comentário):
Métodos adicionais para diminuir a contagem média de bits por segundo para cada jogador:
Você escreveu que envia "O objeto não foi alterado". Não há razão para fazer isso. Se você se preocupa com a perda de pacotes (e com a simulação fora de sincronia por causa disso), considere o seguinte: A cada passo fixo do tempo (por exemplo, 100, 200, 300, 400 ...) faça o hash do estado da simulação e envie-o ao servidor . o servidor confirma ou envia um instantâneo completo de todos os dados de volta.
Para coisas como foguetes ou até jogadores, você pode empregar não apenas interpolação, mas também extrapolação para tornar a simulação mais realista. Exemplo 'Foguete': em vez de atualizar com mensagens como "Agora está na posição x", basta enviar uma mensagem contendo o seguinte: "Foguete gerado: posição (vetor), tempo (em que etapa de simulação o foguete foi gerado), velocidade ( vetor)". Portanto, você nem precisa incluir a rotação, porque a ponta sempre estará na direção da "velocidade".
Combine vários comandos em uma mensagem e nunca envie mensagens menores que 16 a 20 bytes, porque o cabeçalho do udp será maior que a própria mensagem. Também não envie pacotes maiores que o MTU do seu protocolo, pois a fragmentação diminuirá a velocidade da transmissão.