xMLSocket, Flash

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
ASGuru
Сообщения: 6
Зарегистрирован: 13 ноя 2012, 00:12

xMLSocket, Flash

Сообщение ASGuru »

Добрый день, столкнулся с проблемой. мы пишем реалтайм игру, на карте появляется два объекта, которыми управляют игроки и двигаются по ней, один объект - один игрок, управление с помощью клавиатуры. Координаты объектов передаются между клиентами (игроками) с помощью XMLSocket, серверная часть написана на Python

Все отлично передается, объекты перемещаться, но у клиента объект которым управляет другой клиент ( т е координаты которого поступают от сервера к данному клиенту ) "подлагивает", перемещаться рывками, причем данное явление не постоянно, движение то плавное, как и должно быть, то "лагает", обновление координат данного объекта происходит при получении новых данных по совету (событие sp Socket Data). Отправка данных происходит при обновлении кадров (событие Enter Frame), 24 кадра в секунду, отправку делал и с помощью Таймера, выставляв значение отправки координат вплоть до 1 мс ( 1000 запросов на сервер в секунду), что кстати дало небольшой положительный эффект, но все равно подлагивания есть.

Пинг до сервера в среднем 30-33 мс, вроде бы должно быть все норм. Кто то сталкивался с такой проблемой, как ее можно решить, что можно оптимизировать?
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: xMLSocket, Flash

Сообщение Alazaur »

Собственно, а накой отправлять /получать новые координаты по ENTER_FRAME?
Почему бы не замутить по началу/окончанию движения юнита. Мол тот-то начал движение в том-то направлении, и двигать юнита, пока не придет сообщение, что такой-то закончил движение.
Или, если получать именно так как у вас, то не ставить юнитов в новые полученные координаты, а направлять их туда.
ASGuru
Сообщения: 6
Зарегистрирован: 13 ноя 2012, 00:12

Re: xMLSocket, Flash

Сообщение ASGuru »

Получение новых координат идет при событии Socket.DATA

Пробовал делать, что бы физика движения объектах которым управляет другой клиент считалась на стороне клиента, но физика движения объектов достаточно сложная, применяются математические вычисления и даже при небольшом пинге до сервера ( а пинг величина не постоянная, всегда разный то 30 мс, то 33 мс, следовательно начало и конец математических вычислений у одного клиента будет отличатся от другого ) и следовательно движения объектов у разных клиентов будут разныет, хотя кажется что какие то милллисекунды, заранее предугодать куда именно попадет объект я не могу ( допустим если бы объект перемещаться по клеткам на карте, то тут предугодать поведение объекта проще)

Думал что с сервера запросы отправляются в неправильном порядке и иногда один запрос уходит на клиент раньше чем предыдущий, но нет все впорядке.
ASGuru
Сообщения: 6
Зарегистрирован: 13 ноя 2012, 00:12

Re: xMLSocket, Flash

Сообщение ASGuru »

Да и выставив в Таймере 1 мс , он не будет отправлять 1000 запросов в сек, это я загнул))) Adobe не рекомендует выставлять delay меньше 20.
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: xMLSocket, Flash

Сообщение Alazaur »

Как вариант. Получать новые координаты юнита и вычислять:
Угол перемешения юнита = Math.atan2(новыйY - старыйY, новыйX - старыйX);
Юнит.x += скорость * Math.cos бла бла бла.
Вобщем направлять юнита в новые координаты с корректировкой угла и скорости перемещения при каждом получении новых координат.

Но если движение на столько сложное, что и такой способ неприменим, то х.з. даже, с подобным не сталкивался. Вам стоит попробовать на флешере спросить, там профи по-умнее сидят.
ASGuru
Сообщения: 6
Зарегистрирован: 13 ноя 2012, 00:12

Re: xMLSocket, Flash

Сообщение ASGuru »

В любом случае, спасибо!
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: xMLSocket, Flash

Сообщение bodnar »

вот что мне думается
передавать по ентерфрейм не есть хорошо, потому что fps значит частота появления кадров будет зависеть от мощности процессора, от кол-ва ресурсоемких открытых программ (скайп например любит за здорово живешь кушать 20-30% процессора)

значит сделать отправку через одинаковые интервалы времени t0 (подобрать исходя из того насколько часто могут меняться направление и скорость движения)
в отправляемом сообщении приписывать: время, текущие координаты, вектор движения (t,x,y,v)

я соответственно получив очередной блок данных, анализирую его? предположим я получил два блока данных
t1 x1 y1 v1
а спустя некоторое время
t2 x2 y2 v2

я знаю время отправки данного сообщения и предыдущего сообщения от перемещающегося объекта, и я знаю чему эта разница должна быть равна(t0)

(t2-t1)-t0= время пинга, если оно превышает какое нить предельное значение значит либо очередной пакет потерялся, либо связь нарушена, либо сервак на пределе рабоает etc

я знаю где у меня был объект был во время получения первого сообщения и куда он двигался, я могу высчитать где он должен был оказаться [x1,y1]*v1 = x2предсказываемое y2предсказываемое
а еще я знаю где он реально оказался в данный момент это x2 y2

соответственно разница между рассчитываемыми на основе предыдущего сообщения координатами, и реальными координатами нас и интересует

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

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

вот как то так мне это видится
НО
наверняка я намудрил и можно все сделать проще и удобнее, но то что в голову первое пришло

upd: пока писал предложили похожую идею)
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: xMLSocket, Flash

Сообщение sanych_dv »

А зачем в данном случае гонять данные через сервер, если можно это делать напрямую между клиентами через RTMFP? Это реальная push-технология, не требующая никаких временных циклов для проверки состояния объекта. К тому же легко отслеживаются ошибки соединения.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: xMLSocket, Flash

Сообщение sanych_dv »

Что касается расчетов на сервере физики движения. Флэш, конечно, изначально не создавался для решения астрономической задачи "трех тел", но вполне корректно работает с математикой при достаточных объемах графических вычислений - например, в Nape или Alternativa3D. Если вам нужна серверная подпорка флэшу для математики, это значит одно из двух: либо неподходящие алгоритмы в вашем коде, либо выбор флэша в качестве платформы для приложения изначально неверен.

Кстати, если вас столь волнует скорость расчетов у клиента - пусть сразу же беспокоит вопрос, за какое время полста одновременно играющих пользователей положат ваш сервер.
ASGuru
Сообщения: 6
Зарегистрирован: 13 ноя 2012, 00:12

Re: xMLSocket, Flash

Сообщение ASGuru »

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