Player.IO. Онлайн игры в реальном времени

Наконец настало время перейти к более интересному и более сложному типу онлайн игр — игры в реальном времени.

Игры в реальном времени намного сложнее с точки зрения разработки, но при этом более интересны для игроков, и за счет этого имеют больший цикл жизни и имеют в разы больше фанатов.

Разработка игры в реальном времени не для слабонервных. Создавая онлайн игру, у вас уйдет неприлично много времени на отладку отдельных частей игры, чтобы они работали максимально хорошо. Вы будете удивлены тем, сколько всего начинает происходить в игровом процессе, который протекает в реальном времени.

В остальных частях этой серии уроков мы будем мало рассматривать кода и сосредоточим свое внимание на теории. Так же мы больше не будем возвращаться к Peer-To-Peer архитектуре. Ранее я уже говорил о том, что P2P плохо подходит для онлайн игр, так вот знайте, что P2P еще хуже подходит для онлайн игр в реальном времени. Если у вас нет центрального органа управления игрой (сервера), то любые проблемы, возникающие в игровом процессе происходящем в реальном времени, становятся в разы серьезнее, так как возможно бесконечное количество противоречий в игровой логике, и в итоге в игровом процессе может случиться отвратительный беспорядок. Хотя, конечно, онлайн игры в реальном времени через P2P возможны — но для такого расклада вы должны либо быть безумцем, либо настоящим профессионалом.

Прежде, чем приступить к рассмотрению способов решения основных проблем, мы должны рассмотреть сами проблемы.

Проблема задержек

А начнем мы с примера: у нас есть игра с видом сверху, где каждый игрок управляет своим персонажем – это стрелялка.

Как видно на картинке, второй игрок, находясь в засаде, поджидает первого игрока. Давайте посмотрим, что произойдет если первый игрок начнет двигаться вперед.

Однако вначале мы должны сделать важное уточнение. Вероятнее всего, что первый и второй игрок будут видеть немного разную картину на своих экранах с учетом времени, которое требуется на передачу информации между компьютерами в сети. Это называется задержкой, и это самая большая проблема для игр в реальном времени.

Не прозрачный персонаж — это то, что видит на своем экране первый игрок, а полупрозрачный образ — это то как на своем экране будет видить второй игрок. Первый игрок посылает сообщение второму о том, что он начал двигаться вверх, как показано на картинке.

Знайте, сообщения в сети не могут доходить до других игроков моментально. Как мы видим на картинки сети, второй игрок до сих пор не получил информацию о том, что первый игрок начал свое движение. Таким образом, на экране второго игрока, первый игрок остается там, где он есть. И на данный момент не существует никакого способа узнать, что первый игрок начал движение.

Как только второй игрок получает сообщение, он узнает, что первый игрок двигается. Тем не менее на экране второго игрока положение первого игрока не соотвествует действительности. Положение первого игрока будет иметь отставание ровно на столько времени, сколько понадобилось, чтобы сообщение дошло от первого игрока до второй игрока. В среднем время на отправку сообщения во флеш игре может занимать от 50мс до 500мс.

На данный момент второй игрок видит первого игрока и хочет выстрелить в него. И как мы сейчас увидем — это еще больше усугубляет проблему.

Обратите внимание на две вещи:

  • Второй игрок стреляет;
  • Первый игрок еще не знает о том, что второй игрок выстрелил в него.

 

Здесь мы можем видеть, как первый игрок получает сообщение о том, что второй игрок выстрелил в него. Второй игрок видел как он стрелял непосредственно в первого игрока, но при этом первый игрок видел, что второй игрок точно промахнулся. Вопрос: попал ли второй игрок в первого игрока?

Попал ли второй игрок в первого игрока?

Вот варианты ответов:

Первый игрок видит, что второй игрок совершенно очевидно не мог попасть в него, и таким образом, первый игрок считает, что игра имеет баги, лаги, злится и теряет доверие и интерес к игре.

Второй игрок видит, что он совершенно точно попадает в первого игрока, и таким образом, второй игрок считает, что игра имеет баги, лаги, злится и теряет интерес и доверие к игре.

Добро пожаловать в удивительный мир задержек!

В течении следующих нескольких статей мы рассмотрим возможные пути решения этой проблемы.

Это вольный перевод статьи: «Building Flash Multiplayer Games — Real-time Games»

Содержание

  1. Как создать онлайн игру? Анонс
  2. Player.IO. Введение
  3. Player.IO. Основы или первая онлайн игра
  4. Player.IO. Пошаговые игры
  5. Player.IO. Сетевые архитектуры
  6. Player.IO. Безопасность в онлайн играх
  7. Player.IO. Пример пошаговой игры
  8. Player.IO. Онлайн игры в реальном времени
  9. Player.IO. Синхронизация игроков
  10. Player.IO. Интерполяция или удивительный мир обмана
  11. Player.IO. Решение проблемы задержек
  12. Player.IO. Советы и рекомендации

 


Индикаторы: Уроки, Action Script 3
Постоянная ссылка

 

 

будет очень интересно почитать, оставшиеся части уроков

ani526
9 Ноября 2012
— 08:45
#

Антон спасибо!
Да проблема действительно серьезная. Скорее бы увидеть методы ее решения :)

Иван
9 Ноября 2012
— 09:08
#

Объяснение с рисунками и анимацией очень круто исполнено.
Спасибо.

q13
9 Ноября 2012
— 12:15
#

как всегда, приятнейшая визуалка) спасибо

Евгений
9 Ноября 2012
— 15:19
#

Супер! Как замечательно всё показано!
Спасибо Антон! 0_0`

[b]Crash[/b]
9 Ноября 2012
— 15:48
#

Спасибо, отличный урок! Только и ждал уроков по реал-тайм играм! Ждем с нетерпением следующую часть!

Ян
9 Ноября 2012
— 16:16
#

Круть

Алексей
10 Ноября 2012
— 01:08
#

Да очень интересные статьи начались! Сам лично занимался прототипом мультиплеера. Будет интересно обсудить способы обхода задержек.

FlashMainac
10 Ноября 2012
— 01:09
#

:((
кагда же будет физика в антхилле...

nape
10 Ноября 2012
— 14:41
#

nape, кому надо - тот прикрутил уже ;-) и так такой подарок сделали, надо хоть немного самому пошевелиться всё-таки.

Александр
11 Ноября 2012
— 08:15
#

А я долго думал о физике, но так и не решился, мне кажется она не стоит того, чтобы на неё заморачиваться, если конечно не делается игра построенная на физических законах)

По теме - Как кусочек торта дали откусить) Не успел разогнаться а уже конец статьи)
Пока можно только предполагать возможные пути решения, мне кажется, что когда первый игрок отправляет информацию что он идёт вперёд - надо не двигать его у клиента. Примерно такой порядок - Клиент1 отправляет сигнал о движении - сервер получает информацию - сервер отправляет информацию что клиент1 движется всем заинтересованным клиентам - клиент1 и клиент2 ПРИМЕРНО одновременно получают информацию, что клиент1 движется - клиент1 начинает движение персонажа на экране(получается, что с момента отдачи команды прошла небольшая задержка до того момента как спрайт реально начал двигаться), клиент2 тоже отображает что спрайт клиента1 движется - в результате движения игроков будут максимально синхронизированы в случае примерно одинакового пинга, даже высокого. Однако при разном пинге нужно вводить дополнительные корректировки.

При выстреле, думаю, сервер должен решать - попал игрок или нет, и отсылать эту инфу клиентам. в случае попадания, клиент один отображает не выстрел "мимо" как на картинке, а корректирует направление выстрела на спрайт игрока1, чтобы не создавать у него ощущения что противник выстрелил в молоко а попал в него.

Вот такие вот мыслишки возникли с утра в воскресенье)

Владимир
11 Ноября 2012
— 10:31
#

Введение "меткости" и "уклонения" упрощает систему - при выстреле нужно всегда ориентировать спрайты друг на друга, производить выстрел, который явно попадает в цель, а дальше все решают параметры. В принципе, всё зависит от того, какую систему прицеливания выбрать.

Владимир
11 Ноября 2012
— 10:38
#

подключить nape в anthill - не проблема вообще.

.nodoxi
12 Ноября 2012
— 11:55
#

Ты тут кое-чего обещал:

http://www.ant-karlov.ru/Flash-GAMM-Moscow-2012-ofitsialniy-otchet.html

"на котором мне посчастливилось быть и о котором я на днях напишу свой, не официальный отчет :)"

Ну и где он?

Fear Factory
13 Ноября 2012
— 16:27
#

Антон, тебе сейчас 28 лет?
Или информация about устарела?

Fear Factory
13 Ноября 2012
— 16:40
#

@Fear Factory, что-то не сложилось у меня с отчетом по предыдущему FlashGAMM`у, наверное уже и не сложится.

Да, 28 лет, информация актуальна.

Ant.Karlov
19 Ноября 2012
— 14:16
#

Когда следующий урок?

Марк
21 Ноября 2012
— 20:06
#

@Марк, болею. Нет возможности и сил готовить новые уроки. Извините за задержку.

Ant.Karlov
21 Ноября 2012
— 22:51
#

Желаем тебе от всей души скорейшего выздоровления.

ani526
22 Ноября 2012
— 00:04
#

Да, именно! Выздоравливай!

Марк
22 Ноября 2012
— 00:05
#

выздоравливай!

.nodoxi
22 Ноября 2012
— 21:58
#

Чуть запоздало, но если еще не выздоровел - выздоравливай по быстрей, пожалуйста! =)

Rokzero
27 Ноября 2012
— 22:19
#

Уж очень долго. )

Марк
5 Декабря 2012
— 01:06
#

@Марк, скоро будет. С накопившимися делами разберусь и вернусь к блогу. :)

Ant.Karlov
5 Декабря 2012
— 01:18
#

Антон, сделай тутор к 9 числу - к месяцу с публикации последнего туториала)))

Марк
7 Декабря 2012
— 01:24
#

Антон, а где можно посмотреть твое портфолио:

1) Как программиста.
2) Как художника.

Fear Factory
7 Декабря 2012
— 21:24
#

@Fear Factory, у меня нет специального "портфолио" для демонстраций. Здесь можно посмотреть проекты в которых я участвовал больше как программист, а здесь игры в которых я программист и художник.

Уб участиях в каких-то сторонних проектах я рассказывал пару раз в блоге.

Ant.Karlov
8 Декабря 2012
— 00:56
#

Если брать во внимание написанное в предыдущих статьях, то можно предположить, что весь процесс описанный в этой статье будет происходить на стороне сервера и сервер будет отправлять клиентам информацию для отображения проиcходящего,
т.е. и первый и второй игрок увидят только то, что отправит им сервер :)

Nikolai Pankin
12 Декабря 2012
— 21:40
#

Хорошо! Все бы так писали

переделка микроавтобуса
4 Января 2013
— 22:23
#

Автор +1

Gu-li
17 Января 2013
— 16:12
#