Можно ли делать сетевые игры в реальном времени в Actionscript 3.0? - PullRequest
5 голосов
/ 26 января 2011

Вопрос. Можно ли обновить более 100 объектов во Flash Player через сокет-соединения?Подробности и моя собственная попытка ниже!

Детали

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

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

Я попытаюсь объяснить поток сети / игры.

  1. Клиент подключается к серверу с помощью двоичного файлаКласс сокета в AS3
  2. Сервер запрашивает подтверждение, а клиент отправляет имя и миниатюру.
  3. Сервер ожидает подключения 4 клиентов (некоторые сопоставления и т. Д.)
  4. Сервер выбирает 4 клиента изаставляет их работать в отдельном потоке (объединенном в команду)
  5. Клиент отправляет свою оценку производительности на диапазон серверов 1-100.
  6. Сервер делает лучший клиент хост-машиной для физики иостальные 3 раба
  7. Ведущая игра устанавливает уровень и составляет около 1-100 фигур на уровне (основные формы и сложные формы, такие как мосты, моторы, пружины)
  8. Каждый шаг по времениХост получает все обновленные свойства фигур и отправляет их клиентам (x, y, вращение, сон)
  9. Клиент применяет все свойства формы к правильному shapes

Я пробовал разные временные шаги и заметил, что до 1/15 секунды клиент (раб) не будет замечать никаких задержек в игре.Я также попытался выбрать более низкий временной шаг и анимацию движения фигур, но это дало странное движение на стороне клиента (ведомого).

Я приведу пример пакета обновления одного объекта.

<O|t=s:u|x=201|y=202|f=automaticoo</O
<O|t=m:p|x=100|y=345|f=automaticoo</O

Я заметил, что Flash Player может помещать много пакетов в буфер перед отправкой.Например, если я отправляю много пакетов одновременно, они складываются и отправляются вместе на сервер.С более быстрыми временными шагами вы не получите больше обновлений на стороне клиента (ведомого), но больше обновлений в той же строке пакета.

Пытается

  1. Для обновления используйте новый протокол RTMFP (udp & p2p).(немного лучше по производительности, но меньше по надежности)
  2. Кодируйте весь мой сокет-сервер на c ++ вместо Air (с ServerSocket) (лучше по производительности, но заметил, что отстающая часть - это не сервер, а Flash Player)
  3. Используйте метод сжатия ByteArray и сериализованный формат AMF (производительность примерно одинакова, за исключением того, что сервер c ++ не может десериализовать сообщения)

Ребята, думаете ли вы, что это возможно вFlash Player также обрабатывает так много запросов на обновление каждый шаг.

Открытия

В ActionScript 3.0 существует многопользовательская игра на арене.Они использовали много хитростей, и даже тогда я получаю пинг около 300 мс, и он постоянно обновляет игроков (4 игрока в лобби).

Извините за длинный пост.

Ответы [ 3 ]

7 голосов
/ 14 апреля 2011

Я считаю, что ваша проблема сводится к типу игры и данных.

Это снова разбивается на:

  • скорость сервера (для вычислений требуются ЦП + ОЗУ для данных о мире / игроке)
  • скорость соединения (пропускная способность на сервере)
  • размер данных (сколько информации нужно и как часто)
  • Форма взаимодействия с игроком (событие или FPS)
  • расстояние от клиента до сервера (ping)

MMORG

Например. Насколько мне известно, World Of Warcraft в мире без PVP использует «клиент - это область просмотра» и «клиент посылает нажатия клавиш», «сервер проверяет и выполняет, и сообщает клиенту, что происходит» на основе CLIENT-SERVER.

Это дает игре большую приемлемую задержку, так как вам нужно только передать команды от клиента, а затем результаты к клиенту. Остальное нарисовано на клиенте.

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


Counter-Strike / Battlefield и т. Д.

FPS, быстрое действие, быстрое реагирование, чтобы постоянно получать информацию о каждой детали. Это повышает требования к точности. Столкновение является обязательным как для игрока, так и для оружия.

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


Сетевая задержка

В идеальном мире это будет 0 мс, но, как мы все знаем. Все оборудование от клиента до сервера и обратно занимает время. Как через сетевые стеки, так и через интернет-соединение (коммутатор, маршрутизатор, модем, оптоволоконные сети и т. Д.), Поэтому многие современные игры в реальном времени исправляют это путем «предсказания». Позвольте серверу взглянуть на ваше направление и скорость. Затем они пытаются предсказать (как и GPS в туннеле), что вы в последний раз видели движение вперед со скоростью +4, поэтому с учетом временного периода вы двигались (временные рамки x 4) - но что, если вы замедлились или ускорились? вверх? затем они либо мгновенно «перепрыгивают» вас из А в В за долю секунды, и вы чувствуете, что игра запаздывает, или они легко переходят в реальное положение, так что ваш «герой» скользит немного быстрее или медленнее в правильное положение.

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


Какие данные сети необходимы?

Я прочитал ваш вопрос и подумал: это может быть сжато довольно много. Во-вторых, я сделал чат с сокетом Flash на чистом ByteStream, и это сработало. Начать было тяжело, но как только я его запустил, все стало быстро.

Флэш-клиент / плеер сам по себе не является крупнейшим сетевым клиентом, так что ожидайте также много потерянной скорости. Я бы выбрал 10-15 кадров в секунду для сетевой части, а затем использовал бы более RAW подход для данных, отправляемых туда и обратно.

Наконец, постарайтесь максимально упростить данные.

Например. используйте КОМАНДЫ / СОКРАЩЕНИЯ для определенных данных / событий. Например, строка данных сервера может быть: 0x99, 0x45,0x75,0x14,0x04,0x06

Где 0x99 означает: БОЛЬШОЙ ВЗРЫВ в следующих КООРДАХ: (0x45,0x75) Тогда 0x14 означает: ИГРОК 0x14 (игрок 20 в десятичном формате) переместился в (0x04, 0x06)

Таким образом, стартовый код операции сообщает обработчику сетевых протоколов на вашем клиенте и сервере, что ожидать дальше. (Это то, как процессор знает, как читать память между прочим.)

Для моего чата у меня были команды для каждого типа проанализированных данных. Один для входа в систему, один для трансляции, для сообщения имени пользователя и т. Д. Поэтому, как только клиент сделал вход в систему, клиент получил команду + множество онлайн-пользователей. Это было передано только один раз клиенту. После этого каждый подключенный клиент тоже получал команду «новый пользователь онлайн» с именем нового пользователя. Каждый клиент вел свой собственный список с текущими пользователями и идентификаторами, так что мне нужно было только сказать, какой номер клиента говорит текст. Это держало трафик на минимуме. То же самое можно сказать о координатах или командах того, что делать. «Игрок №20 идет на север» и т. Д. Может быть 0x14, 0x41, 0xf0 (0x41 может быть MOVE, 0xf0 может быть NORTH, 0xf1 EAST и т. Д.)


Это физическое расстояние до игры

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


Взлом / жульничество

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

Для начала не возражайте против этого, просто помните, что как только вы выходите в интернет, вы НИКОГДА не знаете, кто в мире или где они находятся. Я не пытаюсь сделать вас параноиком, но есть больные люди, которые будут пытаться зарабатывать деньги, обманывая других.

Так что подумайте об этом в своих структурах, не показывайте данные в сетевых пакетах, которые не нужны. Не верьте, что данные от клиента всегда верны. Проверка данных на стороне сервера.

Это также требует времени, если у вас есть 100 активных игроков одновременно.

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


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

Фактически, я бы сказал: ДА 100 игроков возможно, но это зависит от того, все ли они движутся одновременно и требуется ли тестирование столкновения, и примете ли вы лаг или нет.

1 голос
/ 26 января 2011

Возможно, лучшим вариантом было бы выполнить физику на сервере И на каждом клиенте с синхронизацией (позиции объекта сервера перезаписывают позиции клиента).Таким образом, все клиенты получают равные лаги.Пока расхождение не будет низким (как и должно быть), исправления не будут заметны.Если вы используете Box2D, у вас есть готовая версия для AS3 и C ++.Но это совершенно другая архитектура, стоит 3 месяца, чтобы реализовать сама.Какое отставание вы получаете на пустой / простой арене?В ограниченное время упрощение может быть вашим единственным вариантом.

1 голос
/ 26 января 2011

Вопрос. Можно ли обновить более 100 объектов во Flash Player через сокет-соединения?

Фосфор 2, кажется, отрывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...