Це пов’язано з продуктивністю MMO, за винятком того, що питання стосується пропускної здатності. Йдеться про навантаження на процесор.
Я зібрав простий FPS за допомогою node.js та webGL. Це надзвичайно просто, дуже схоже на клон BuddyMaze MIDI Maze. Там відбувається дуже мало, кожен рухається в двох вимірах (немає висоти), вистрілює прості снаряди і біжить у стіни.
Зараз, якщо я здійснюю кілька підключень до сервера, де кожен гравець швидко стріляє, крутячись по колах, я можу отримати приблизно 15 - 20 гравців у грі, перш ніж сервер витягне ядро та сповільнить шлях. І це при запуску на сервері на 30 кадрів в секунду. При 10 кадрів в секунду я отримую близько 25 - 30 підключень. Це дуже погано, оскільки незабаром у грі буде набагато більше, і мені потрібно підготувати більше гравців, щоб це було здійсненним.
Мій брат лише вказав на статистику щодо сервера TF2 свого колеги. Його сервер є нижчими характеристиками, ніж у нас, але він працює з TF2, очевидно, набагато складнішою грою, із колосальними 500 тиками в секунду, з 36 користувачами на ядро. Також ми зараз споживаємо набагато більше пропускної здатності, ніж вони, але ми ще не намагалися знизити стільки.
Як це можливо? Які існують хитрощі, щоб збільшити продуктивність сервера до такої величини? Деякі речі, які я знаю, включають:
- Зниження частоти кадрів на сервері та інтерполяція позицій на клієнті. Я отримав певну вигоду, але явно сервер TF2 цим навіть не турбує.
- Робити дорогі речі, такі як виявлення зіткнень на клієнті, і нечасто перевіряти це на сервері. Я ще не переніс це, я вже сьогодні ввечері. Навіть тому я не очікую такого величезного виграшу.
- Розбийте ігрове поле на регіони (квадратичні дерева), щоб мінімізувати обчислення. Ще не було можливості для цього.
- Я вважав прикрою можливістю, що node.js просто повільніше, ніж будь-який TF2 використовує, і може не підходити для такого роду завдань високої інтенсивності.
- Чи все в магії конфігурації сервера?
Тож, які інші прийоми в галузі, щоб зробити на сервері лише мінімальний необхідний мінімум, але все-таки мати бездоганний досвід гри? Існує великий конфлікт між "відкласти клієнтові, щоб заощадити час процесора" та "не довіряти клієнту", тож, можливо, це допомагає дізнатись, де виводиться лінія в різних ситуаціях?
Оновлення
Профілювання справді - єдина мантра, яку я коли-небудь виявляв, що абсолютно непогрішна. Я швидко обернув деякі функції синхронізації навколо свого коду (спасибі, FP!) І виявив те, чого я ніколи не очікував: акт передачі даних клієнтам припадає майже на весь час виконання. Зокрема, близько 90%. Подальше тестування показало, що цей час залежить як від кількості клієнтів, так і від розміру даних, але тим більше останніх. Під час завантаження 20 користувачів я скоротив час мовлення на 90%, з 24 мс до трохи більше 2 мс, надсилаючи лише "{}" замість повних даних. Але лише для 5 користувачів мовлення займає близько 0,5 мс. Тому мені явно потрібно провести певну оптимізацію.
Перше найбільш очевидне поліпшення - це перевірка зору. Це зменшило б як кількість людей, які піклуються про дані, так і кількість даних, що надсилаються зацікавленим сторонам. Чи можна в цій царині спробувати інші хитрощі, які зосереджуються на мінімізації витрат на мою трансляцію?