Вам потрібно лише близько 30 оновлень (а то й менше, можливо, 10 чи 20) за секунду. інтерполювати позиції клієнта, що рухається, на сторону. Загалом, ви повинні надсилати дані лише тоді, коли це дійсно потрібно. У WoW ви можете отримувати більше оновлень від гравців, з якими ви перебуваєте в групі, ніж від гравців, які перебувають в одному місці. Крім того, якщо інший гравець далеко від вас, ви не отримуєте стільки оновлень за секунду про нього.
Потім, коли він підключиться, надішліть лише один повний знімок кожному гравцю. Після цього надсилайте лише зміни ігрових об’єктів. Якщо жодна зміна не відбулася, не надсилайте її.
Потім скористайтеся BitVectors або howevery, ви можете зателефонувати їм, щоб зменшити кількість непотрібних даних! Приклад: Ви також можете спробувати записати поплавок, використовуючи лише один байт (в діапазоні від 0 до 1 або -1 до 1), щоб у вас було лише 256 або 128 різних значень. Але гравець не помітить жодних ривкових рухів завдяки інтерполяціям.
Подивіться на приклад із LidgrenLibrary про те, як стискати дані: http://code.google.com/p/lidgren-network-gen3/wiki/Optimization
Далі: Спробуйте зменшити радіус перегляду гравців під час їх переміщення і лише передавати важливу інформацію за цей час. Потім, коли вони зупиняються, знову збільшуйте радіус зору. Ви можете використовувати систему просторового хешування або дерево bsp, щоб зменшити накладні витрати на пошук об'єктів, які знаходяться "в діапазоні". Це хороше прочитання теми: http://en.wikipedia.org/wiki/Collision_detection
Також стискайте дані, ЩО ВАМ САМО ВИ знаєте про структуру даних та часову узгодженість даних (що можна і потрібно використовувати). Загальний алгоритм, такий як Bzip2, Deflate, як би там не було, слід використовувати, але лише як завершальний етап стиснення!
Крім того, для інформації, яка не є важливою для гри, ви також можете використовувати додаткові методи P2P. Приклад: Гравець грає в анімацію "привіт" (Просто графічний ефект) Гравець передає цю інформацію на сервер, але сервер не передає інформацію іншим гравцям. Натомість цей некритичний ефект відтворюється самим гравцем іншим клієнтам у діапазоні.
EDIT (через коментар):
Додаткові методи зменшити середню кількість бітів в секунду для кожного гравця:
Ви написали, що відправляєте "Об'єкт не змінився". Причин для цього немає. Якщо ви турбуєтеся про втрату пакету (і через те, що ваше моделювання не синхронізується через це), врахуйте наступне: На кожному фіксованому часовому кроці (наприклад, 100, 200, 300, 400 ...) хеш-стан стану моделювання та надішліть його на сервер . сервер підтверджує або надсилає повний знімок всіх даних назад.
Для таких речей, як ракети або навіть гравці, ви можете використовувати не тільки інтерполяцію, але й екстраполяцію, щоб зробити моделювання більш реалістичним. Приклад "Ракета": Замість оновлення повідомленнями типу "Зараз у позиції х" просто надішліть повідомлення, що містить таке: "Ракета породила: позиція (вектор), Час (на етапі моделювання ракети породжувались), швидкість ( вектор) ". Таким чином, вам навіть не потрібно включати обертання, тому що наконечник завжди буде в напрямку "швидкості".
Поєднайте кілька команд в одному повідомленні і ніколи не надсилайте повідомлення розміром менше 16-20 байт, оскільки заголовок udp буде більшим, ніж саме повідомлення. Також не надсилайте пакети, більші за MTU вашого протоколу, оскільки фрагментація сповільнить швидкість передачі.