|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.02.2014, 00:30 | #1 |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
Оптимальный способ организации передвижения в онлайн играх
Привет. Вот представьте себе любую из ммо рпг игр, ну где люди бегают и дерутся друг с другом. Я хочу создать подобную игру (только в 1000 раз круче, конечно же), и вот не могу решить, каким образом перемещать персонажей. Самое первое, что я сделал, так это стал просто очень быстро и много передавать текущие координаты персонажа. Ну там очень много раз в секунду, около 100 или даже больше. Но сами понимаете, если даже пакет с данными весит 250 байт (а у меня именно так), то трафика оно жрет не мало, к тому же передавать нужно не только позицию, но и всякие другие штуки. Так вот, при такой организации за одну минуту будет передаватся 250*100*60/1000=1.5 мегабайта, и ящитаю, что это много. Я поспрашивал у других людей, и мне сказали, что в таких играх вообще только 3 раза в секунду данные передаются, ну максимум 5, а плавные движения делаются интерполяцией. Ну я пробовал сделать интерполяцию, но там у меня не очень хорошо получилось, поэтому я пошел дальше. Была идея сделать так, передавать скорость и вектор направления, в котором двигается персонаж, это работает так: вы передаете скорость, вектор, далее он приходит к другому клиенту и персонаж двигается в указаном направлении с указаной скоростью, пока не придет команда остановится, но тут тоже была проблема. Потому что пока команда остановится доходит до персонажа, он все еще двигается, и когда команда уже приходит, то персонаж зашел чуть дальше, чем нужно было. Конечно, вместе с командой остановки я передавал позицию персонажа, в которой он остановился, и когда эта команда и позиция доходила к другому клиенту, то персонаж останавливался и перемещался в позицию остановки, это, вроде, и гарантировало то, что персонаж будет стоять в точной позиции, но было очень заметно, как персонаж идет-идет, а потом бац и отпрыгнул назад. Короче, советуйте годных идей по реализации плавного и точного передвижения без отправки миллионов мегабайт в секунду xD
|
24.02.2014, 06:05 | #2 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Передавайте не 100 раз в секунду и жмите трафик каким-нибудь архиватором.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
24.02.2014, 08:02 | #3 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Судя по тому, что я видел в той же линейке во время т.н. "лагов", там используется система с предсказанием для сглаживания задержек сети. (т.е. вы передаете что игрок1 двигается с такой-то скоростью туда-то, и просто уточняете их периодически)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
24.02.2014, 10:21 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Кстати, это будет 1,5 МБ в минуту. В секунду же - 25КБ.
Ну и 100 раз по мне так слишком много - 20 хватит выше крыши... а это уже 5КБ |
24.02.2014, 13:54 | #5 |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
|
24.02.2014, 13:55 | #6 |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
ну я ж так и делал, только без уточнения, ну а зачем оно? если сказано, что персонаж идет прямо, то пусть идет прямо, зачем лишний раз говорить ему, чтобы он шел прямо? Но как только направление меняется, так сразу и приходит новая команда, иди туда-то
|
24.02.2014, 13:56 | #7 |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
а сколько раз нужно? я просто смотрел сетевые логи, или как оно зовется, одной игры, и там вообще как-то странно все было, вроде персонажи двигаются, но ничего не приходит... может я как-то криво мониторил этот трафик...
|
24.02.2014, 15:18 | #8 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
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. |
|
24.02.2014, 15:55 | #9 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 722
|
Ну командные пакеты не должны пропадать, для этого и прокручивается подтверждение доставки.
Клиент серверное взаимодействие: Client – нажата кнопка вперед Server – игрок нажал кнопку вперед ServerTick, всем - игрок такой то изменил координаты начал движение. Client – отрисовка перемещения движения вперед Те как видим задержка – ping + разница между получение пакета и тиком сервера. |
24.02.2014, 16:10 | #10 | |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оптимальный способ отправки файлов | 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 |