Это связано с производительностью 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 мс. Поэтому мне явно необходимо провести некоторую оптимизацию здесь.
Первое наиболее очевидное улучшение - это проверка линии зрения. Это уменьшит как количество людей, которым небезразличны данные, так и количество данных, отправляемых заинтересованным сторонам. Есть ли в этой области другие хитрости, которые я могу попробовать, направленные на минимизацию затрат на мою трансляцию?