Участник
Пользователь
- Сообщения
- 496
- Реакции
- 621
- Помог
- 16 раз(а)
Вступление
Приведённая статья актуальная для всех современных многопользовательских игр по интернету, в том числе и для серии Counter-Strike.Разработка онлайновых игр - не самое простое занятие. Режим мультиплеера ставит перед программистом совершенно новые проблемы, в основе которых лежат физика и человеческая природа.
Читерство. Именно с него всё начинается.
Разработчиков однопользовательских игр не особо волнует, честно играет человек или нет, так как действия читера не влияют на других игроков. Конечно, такая игра проходится не так, как планировалось, но это личное дело каждого.
Другое дело - мультиплеер, в основе которого лежит соревновательный режим. В нём действия читера влияют не только на него, но и на окружающих, что недопустимо. Ведь если одни играют честно, а другие - нет, то результат предсказуем. Более того, не получается реально конкурентной борьбы. Разработчику надо всеми силами избегать подобного состояния дел, так как наличие читеров отталкивает пользователей от игры.
Мы можем сделать многое для предотвращения нечестной игры. Главный принцип: нельзя доверять игроку. Всегда следует предполагать худшее - будет попытка сжульничать.
Авторитарные сервера и немые клиенты
В целом использование авторитарного сервера предотвращает ряд читов. Например, нельзя доверить клиенту количество жизней или уровень здоровья. Взломанный клиент отправит ложные данные что у него 10000% здоровья, однако сервер знает, что в реальности у игрока только 10%. Так что при следующем попадании игрок умрёт вне зависимости от того, что рисует клиент.
Нельзя доверить клиенту позицию игрока в мире.
Предположим, игрок находится в точке с координатами (10;10). Взломанный клиент говорит "Сейчас я на (10;10), а через секунду буду на (20;10)". Если сервер поверит, то игрок сможет переместиться сквозь стену или передвигаться быстрее остальных.
Правильным решением является высчитывание на стороне сервера. Клиент говорит "Я на (10;10), хочу переместиться вправо на 1 клетку". Сервер проверяет возможность перемещения, обновляет позицию игрока до (11;10) и отсылает сообщение "Вы на (11;10)".
Подводим первые итоги: игра полностью управляется сервером. Клиент посылает свои действия на сервер, тот периодически обновляет игровой мир в соответствии с полученной информацией и отсылает изменения обратно.
Работа с сетями
Немой клиент отлично себя показывает в пошаговых играх типа шахмат, покера или Heroes Of Might and Magic. В шутерах немного иначе, результаты неплохи при игре по LAN, где у нас идеальная сеть, но при игре по сети Internet модель ломается.Поговорим о физике. Предположим, вы находитесь в Сан-Франциско и подключились к серверу в Нью-Йорке. Расстояние между городами 4000 км или 2500 миль. Примерно как между Москвой и Лиссабоном. Ничто не может двигаться быстрее скорости света. Получается, что сигнал проделает путь в 4000 км примерно за 13 мс.
13 мс - звучит неплохо. Даже хорошо. Но это очень оптимистичный подход. В реальности сигнал проходит через разные сети серией прыжков, от роутера к роутеру. Далеко не везде сеть быстра. Где-то оборудование старо/перегружено и идут задержки, где-то пакеты теряются и отправляются повторно.
Условно считаем, что время между передачей данных от клиента к серверу равно не 13 мс, а 50 мс. Не самый худший сценарий, скорее даже лучший. А что если вы в Нью-Йорке, а сервер в Токио? Каково время передачи данных? 100мс, 200мс, 500мс? Совершенно недопустимые задержки.
Возвращаясь к нашему примеру, клиент отправил на сервер "Я нажал кнопку идти направо, иду вправо с (10;10) на 1". Через 50 мс сервер получит запрос. Предположим, что сервер идеально быстр и мгновенно обработает запрос. Ещё через 50 мс клиент получит ответ "Вы на (11;10)".
Игрок на экране видел следующее: он нажал стрелку вправо, но в течение 100мс(50+50) не происходило ничего. Затем игрок резко сместился на 1 клетку направо. Это и есть игровой лаг. Вроде как небольшой, но в то же время весьма заметный в онлайн-шутерах. И конечно же больший лаг, например, в полсекунды, неиграбелен.
Подводя итоги боя
Игры по интернету классные, но ставят перед разработчиком свои вызовы. Авторитарный сервер архитектурно хорош против большинства читов, однако подобная прямая, бесхитростная реализация делает игру неудобной.Нам надо построить авторитарный сервер и в то же время минимизировать вред от задержек клиент-сервер, дабы приблизить игру по сети Internet к игре по LAN.
Последнее редактирование: