Тема: Black Bird
Показать сообщение отдельно
Старый 24.02.2012, 15:09   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Black Bird

Сообщение от pozitiffcat Посмотреть сообщение
Читал статью какого-то мощного чувака, что все просчеты выполнять только на сервере. Сервер посылает каждому клиенту его данные, тогда будет синхронно, причем что бы исключить рывки при передвижении, нужно передавать не координаты объекта, а кнопки которые он нажал, а они уже обрабатываются клиентом! Короче это жесточайший гемор, я как то баловался танчики писал, что - то получалось, но я так и не осилил работу без глюков. При плохой связи, например получается, что кнопка как-бы заедает... При хорошей связи все окей. Мой совет будешь писать, держи клиент на удаленном сервере VPS, подключай 3G модем и тестируй, добивайся работы без лагов. Тот кто говорит, что на 3G нельзя добиться хорошей работы онлайн - это бред. Я играл в WOW с пингом 400.
Ты видимо очень не внимательно читал, т.к. всё напутал.
Клиент шлёт изменение состояния клавишь, всё примитивно просто: игрок зажал вверх, игрок отпустил вверх, и т.п.
Сервер далее считает всё исходя из инпута, далее выдаёт игрокам уже координаты объектов. Выдача данных должна быть в виде снимков мира, в весьма постоянной переодичности.
Синхронности это никакой не даёт - клиент будет отставать сам от себя в ДВА пинга.
А действие других игроков в адрес тебя, будет на сервере обрабатываться с разностью в ТРИ пинга..
Поэтому есть разные методы синхронизации, сам термин называется dead reckoning.
Есть два метода - интерполяция, и экстраполяция. Первый подрузумевает плавное применение данных от прошлого до последнего данного в наличии. Как поняли тут будет задержка - отставание от сервера в ДВА С ПОЛОВИНОЙ пинга.
Поэтому есть экстраполяция. Это попытка предсказывания следующих данных на основе прошлых. Зная направление движения объекта и скорость - не сложно вычислить его будущую позицию. Но это не просто, нужно использовать сплайны.
Дальность предсказывания должна равняться ровно одному пингу между принимающим данные и сервером.
Даже собственные данные, применяются не сразу, а только как достигнут сервер на самом деле, но ещё не пришли на клиент - получается, что сам свои данные будешь силой задерживать во времени в размере своему пингу.
Таким образом все клиенты будут пытаться симулировать мир максимум приблизительно как на сервере в данный реальный момент.
Также отсылая например данные о выстреле на сервер, если это моментальный выстрел (не летящий снаряд), то сервер принимая данные, должен вычислять в прошлом, назад в размере на один пинг от посылающего, т.к. когда он посылал пакет с выстрелом, то основывался на состоянии мира в тот момент на клиенте, но сервер получит пакет позже на один пинг, поэтому он вежливо берёт данные из прошлого, и делает вычисления там.
На сервере нужно реализовывать машину времени, длиной в максимум секунду (имхо), с наличием всех времени зависимых данных на каждый тик за последнюю секунду. Например если у нас UPS (update per second) == 30, то сервер должен хранить времени зависимые данные со всех этих 30 тиков.
Такие данные как положение персонажа - времени зависимые. Или например жив или мёртв - тоже времени зависимое, т.к. игрок Х может умереть от выстрела игрока А у которого пинг 30, а игрок Б тоже убил у себя игрока Х, но пинг у него 200. Убили они его в реальном времени почти в один момент, но игрок Б чуток раньше (на 50 мс например). Но сервер получит сперва пакет от игрока А, и обрабатывает его в прошлом на 30 мс. Далее через ещё 120 мс после обработки, прийдёт пакет от игрока Б, который если вернуться на 200мс назад, убил игрока Х, который чуть позже также был убит игроком А, но ведь игрок Б раньше это сделал, а из-за пинга мы получили данные позже. Но ведь игрок Б - сделал это раньше.
Вот такой пример-парадокс. И таких парадоксов будет уйма, постоянно! Работать с сетью - это большой геморой, и приступать к кодингу сервера, без долгого штурма пачек бумаги и брэйнстормов с друзьями - тупо нельзя, иначе потратите время, потом переписывать будете.

Да и чтобы создать лаги - не нужно 3G, это очень просто симулировать, реализовав очередь при отсылке и приёме от сервера, внеся туда немного хаоса.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
pozitiffcat (24.02.2012), Samodelkin (24.02.2012), tormoz (25.02.2012)