Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2014, 00:30   #1
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию Оптимальный способ организации передвижения в онлайн играх

Привет. Вот представьте себе любую из ммо рпг игр, ну где люди бегают и дерутся друг с другом. Я хочу создать подобную игру (только в 1000 раз круче, конечно же), и вот не могу решить, каким образом перемещать персонажей. Самое первое, что я сделал, так это стал просто очень быстро и много передавать текущие координаты персонажа. Ну там очень много раз в секунду, около 100 или даже больше. Но сами понимаете, если даже пакет с данными весит 250 байт (а у меня именно так), то трафика оно жрет не мало, к тому же передавать нужно не только позицию, но и всякие другие штуки. Так вот, при такой организации за одну минуту будет передаватся 250*100*60/1000=1.5 мегабайта, и ящитаю, что это много. Я поспрашивал у других людей, и мне сказали, что в таких играх вообще только 3 раза в секунду данные передаются, ну максимум 5, а плавные движения делаются интерполяцией. Ну я пробовал сделать интерполяцию, но там у меня не очень хорошо получилось, поэтому я пошел дальше. Была идея сделать так, передавать скорость и вектор направления, в котором двигается персонаж, это работает так: вы передаете скорость, вектор, далее он приходит к другому клиенту и персонаж двигается в указаном направлении с указаной скоростью, пока не придет команда остановится, но тут тоже была проблема. Потому что пока команда остановится доходит до персонажа, он все еще двигается, и когда команда уже приходит, то персонаж зашел чуть дальше, чем нужно было. Конечно, вместе с командой остановки я передавал позицию персонажа, в которой он остановился, и когда эта команда и позиция доходила к другому клиенту, то персонаж останавливался и перемещался в позицию остановки, это, вроде, и гарантировало то, что персонаж будет стоять в точной позиции, но было очень заметно, как персонаж идет-идет, а потом бац и отпрыгнул назад. Короче, советуйте годных идей по реализации плавного и точного передвижения без отправки миллионов мегабайт в секунду xD
lawliet93 вне форума Ответить с цитированием
Старый 24.02.2014, 06:05   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Передавайте не 100 раз в секунду и жмите трафик каким-нибудь архиватором.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 24.02.2014, 08:02   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Судя по тому, что я видел в той же линейке во время т.н. "лагов", там используется система с предсказанием для сглаживания задержек сети. (т.е. вы передаете что игрок1 двигается с такой-то скоростью туда-то, и просто уточняете их периодически)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 24.02.2014, 10:21   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Кстати, это будет 1,5 МБ в минуту. В секунду же - 25КБ.
Ну и 100 раз по мне так слишком много - 20 хватит выше крыши... а это уже 5КБ
waleri вне форума Ответить с цитированием
Старый 24.02.2014, 13:54   #5
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Передавайте не 100 раз в секунду и жмите трафик каким-нибудь архиватором.
а оно хоть нормально будет работать в плане времени, архивация не заберет много времени? это же должна быть архивация прям на лету, посоветуете что-то?
lawliet93 вне форума Ответить с цитированием
Старый 24.02.2014, 13:55   #6
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Судя по тому, что я видел в той же линейке во время т.н. "лагов", там используется система с предсказанием для сглаживания задержек сети. (т.е. вы передаете что игрок1 двигается с такой-то скоростью туда-то, и просто уточняете их периодически)
ну я ж так и делал, только без уточнения, ну а зачем оно? если сказано, что персонаж идет прямо, то пусть идет прямо, зачем лишний раз говорить ему, чтобы он шел прямо? Но как только направление меняется, так сразу и приходит новая команда, иди туда-то
lawliet93 вне форума Ответить с цитированием
Старый 24.02.2014, 13:56   #7
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Передавайте не 100 раз в секунду и жмите трафик каким-нибудь архиватором.
а сколько раз нужно? я просто смотрел сетевые логи, или как оно зовется, одной игры, и там вообще как-то странно все было, вроде персонажи двигаются, но ничего не приходит... может я как-то криво мониторил этот трафик...
lawliet93 вне форума Ответить с цитированием
Старый 24.02.2014, 15:18   #8
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Сообщение от lawliet93 Посмотреть сообщение
ну я ж так и делал, только без уточнения, ну а зачем оно? если сказано, что персонаж идет прямо, то пусть идет прямо, зачем лишний раз говорить ему, чтобы он шел прямо? Но как только направление меняется, так сразу и приходит новая команда, иди туда-то
Представте ситуацию такую:

1. Команда идти прямо.
2. Команда идти назад.
3. Команда идти прямо.

И теперь представьте что мы случайно потеряли по пути сообщение 2. И все, у вас непоправимая рассинхронизация - сервер думает что мы сделали 1 шаг вперед, 1 назад, и снова 1 вперед, а клиент думает что мы сделали шаг вперед, а потом еще раз шаг вперед.


Что касается движения, то тут можно решить проблему, например, указывая исходную точку.
Например:
1. персонаж идет прямо из точки 0-0;
2. персонаж идет назад из точки 1-0;
3. персонаж идет прямо из точки 0-0;

Тогда потеря пакета 2 будет выглядеть просто как телепортация игрока из точки 1-0 в точку 0-0, с последующим движением прямо, и в итоге он будет выглядеть как и должен.


Ну это пример с движением туда-сюда. А теперь представьте что персонаж пошел прямо и идет и идет..... а клиент пропустил пакет с началом движения... и на сервере персонаж ушел за горизонт, а мы об этом и не знаем. Так что в любом случае вам придется периодически уточнять где персонаж находится и что он делает.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 24.02.2014 в 15:25.
ROD вне форума Ответить с цитированием
Старый 24.02.2014, 15:55   #9
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Ну командные пакеты не должны пропадать, для этого и прокручивается подтверждение доставки.
Клиент серверное взаимодействие:
Client – нажата кнопка вперед
Server – игрок нажал кнопку вперед
ServerTick, всем - игрок такой то изменил координаты начал движение.
Client – отрисовка перемещения движения вперед

Те как видим задержка – ping + разница между получение пакета и тиком сервера.
dampirik вне форума Ответить с цитированием
Старый 24.02.2014, 16:10   #10
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Представте ситуацию такую:

1. Команда идти прямо.
2. Команда идти назад.
3. Команда идти прямо.

И теперь представьте что мы случайно потеряли по пути сообщение 2. И все, у вас непоправимая рассинхронизация - сервер думает что мы сделали 1 шаг вперед, 1 назад, и снова 1 вперед, а клиент думает что мы сделали шаг вперед, а потом еще раз шаг вперед.


Что касается движения, то тут можно решить проблему, например, указывая исходную точку.
Например:
1. персонаж идет прямо из точки 0-0;
2. персонаж идет назад из точки 1-0;
3. персонаж идет прямо из точки 0-0;

Тогда потеря пакета 2 будет выглядеть просто как телепортация игрока из точки 1-0 в точку 0-0, с последующим движением прямо, и в итоге он будет выглядеть как и должен.


Ну это пример с движением туда-сюда. А теперь представьте что персонаж пошел прямо и идет и идет..... а клиент пропустил пакет с началом движения... и на сервере персонаж ушел за горизонт, а мы об этом и не знаем. Так что в любом случае вам придется периодически уточнять где персонаж находится и что он делает.
не не, пакеты никак не пропадают, у меня же TCP, а не UDP.
lawliet93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимальный способ отправки файлов harunk Общие вопросы Delphi 2 04.09.2012 09:50
Единый способ организации данных в программе Utkin Общие вопросы по программированию, компьютерный форум 35 03.08.2010 14:38
access передвижения окна Lord_Termit Помощь студентам 0 19.05.2010 11:53
Оптимальный способ искать слова в текстовой (txt) базе. Alex Cones Общие вопросы Delphi 36 02.10.2009 17:18
Какой оптимальный способ в Delphi для перевода 10 системы счисления в 16с.с SERGOO Общие вопросы Delphi 5 25.05.2007 19:02