Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   SmartFoxServer + Flash = лаги при движении. почему? (http://www.flasher.ru/forum/showthread.php?t=132342)

ИванАнатольевич 10.11.2009 11:32

SmartFoxServer + Flash = лаги при движении. почему?
 
Привет всем.
Вот пишу игрушку SFS + Flash.
Делаю передвижение игроков, но удаленно лагает(((
Кто компитентный в этой сфере будьте добры, объясните что не так я делаю.

Как передвигаются мои игроки:

Когда пользователь нажал на кнопку чтобы идти в какую либо сторону, он начинает идти (по таймеру с тиком 70 милисекунд) в ту сторону и включается таймер на 150 милисекунд (я его назвал antiFastTimer защита от рывков на коротких передвижений), и если пользователь за эти 150 секунд успел остановиться то посылается запрос на стоп игрока с новыми координатами для синхронизации, иначе посылается запрос сереверу с координатами что данный игрок пошел. Также вместе с запросом отправляется пинг данного пользователя (от клиента до сервера в одну сторону). Размер шага у меня 5 пикселей, НО, т.к. таймер всегда работает не идеально и на каждой машине по разному, то размер шага я высчитываю из настоящего тика (беру разницу getTime перед и после тика), подгоняю к идеальному и получается что размер шага то больше то меньше взависимости от четкости работы таймера.

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

Когда тестирую на удаленной машине, движение смотрится коряво, не идеально (даже при пинге в 40-70 милисекунд).

Может быть SF Server работает медленно? Или чтото я делаю не так?

etc 10.11.2009 12:17

Неправильно подходите к вопросу. Где и в какое время должен находится персонаж, вы знаете. Соответственно об этом должны знать все клиенты.

ИванАнатольевич 10.11.2009 12:22

Спасибо за ответ. Могли бы вы расписать более подробно вашу мысль?

О том где находится персонаж и так знают все клиенты. Или я Вас неправильно понял?

etc 10.11.2009 12:57

Где и в какое время.

ИванАнатольевич 10.11.2009 13:13

etc, возможно, Вы неправильно поняли мою проблему, или я неправильно сформировал вопрос.

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

Вопрос как раз в том откуда вылазит такая большая задержка и как от нее избавится?

etc 10.11.2009 23:17

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

ИванАнатольевич 11.11.2009 00:24

Такой подход идеален если игра типа War Craft (где указал точку куда должен бежать игрок, он и бежит до нее) у меня немного подругому. Движение игроков происходит в реальном времени используя клавишы WASD и в любой момент игрок может остановиться или поменять направление движения (как в игре Alien Shooter). Т.е. если постоянно сервер будет говорить всем игрокам а каждом положении персонажа то будет куча запросов => тормоза усилятся.

etc, или я неправильно Вас понял?

Добавлено через 60 часов 22 минуты
etc и другие уважаемые компетентные в данном вопросе люди, помогите плиз

worm333 17.11.2009 17:51

Что если сделать так:
1. Когда пользователь А нажимает на кнопку, его клиент передает на сервер message, о том что А собирается пойти в данном направлении.
2. На сервере это сообщение рассылается всем игрокам и каждый клиент всех игроков начинает модулировть передвижение игрока А.
3. Как только игрок A отжимает клавишу, на сервер передается инфа о том, что А прекратил движение и это сообщение опять рассылается всем, после этого происходит его остановка.
Единственный недостаток такого подхода, это время между посылками и ответами сообщений на сервер, быть может оно будет для вас приемлимо.

ИванАнатольевич 19.11.2009 17:21

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

Так что проблема все еще актуальна. может быть SFS так глючно работает? Есть ли какие-нибудь другие скоростные сокет сервера с поддержкой комнат?


Часовой пояс GMT +4, время: 15:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.