Высокая задержка в iPhone mmorpg - PullRequest
1 голос
/ 12 февраля 2010

Прямо сейчас я пытаюсь сделать mmorpg для iPhone. Я настроил его так, что iPhone запрашивает позиции игрока несколько раз в секунду. Как это происходит, клиент отправляет запрос с использованием асинхронного NSURLConnection на страницу php, которая загружает позиции из базы данных mysql и возвращает ее в формате json. Однако с момента, когда запрашиваются позиции, до момента, когда они действительно загружаются, уходит около 0,5 секунды. Это кажется действительно высоким, есть ли очевидные вещи, которые могут вызвать это?

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

Ответы [ 3 ]

4 голосов
/ 12 февраля 2010

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

Затем измерьте, сколько времени потребуется, когда вы отправляете тот же http-запрос от чего-то другого, чем ваш iPhone (например, это программа c # из 10-15 строк, чтобы понять это).

Если ни один из вышеперечисленных не демонстрирует каких-либо значительных задержек, улучшения необходимо выполнить на стороне iPhone. Некоторые вещи, на которые стоит обратить внимание:

  • GPRS / 3G имеет довольно высокую задержку
  • GPRS / 3G имеет довольно высокую частоту ошибок по битам - это означает, что будет время от времени отбрасываться немало пакетов, что приведет к повторной передаче tcp, и вы будете иметь еще большую задержку
  • HTTP имеет много накладных расходов.
  • JSON добавляет много накладных расходов.

    Может быть, вам нужно придумать компактный двоичный формат для ваших сообщений и отбросить HTTP в пользу пользовательского протокола - возможно, даже вернуться к UDP

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

  • Как минимум, убедитесь, что вы не устанавливаете новое TCP-соединение для каждого запроса. Вам нужно использовать http keep-alive.

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

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

3 голосов
/ 12 февраля 2010

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

Кроме того, не делайте новый HTTP-запрос для каждого обновления. Было бы лучше, если бы вам вообще не нужно было использовать HTTP, так как он действительно не подходит для связи в реальном времени.

GPRS обычно имеет время пинга 600 мс, 3G - 300 мс, а HSPA - 100 мс. Посмотрите, какой режим используется. Обратите внимание, что некоторые устройства (я не знаю iPhone) переходят с HSPA на обычный 3G в целях экономии энергии, когда не хватает трафика для оправдания более быстрого режима.

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

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

1 голос
/ 12 февраля 2010

Загрузка позиций игрока, которые быстро имеют недостатки.

  • Это забивает ваш сервер.
  • 3G на самом деле не предназначен для поддержки приложений с низкой задержкой

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

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

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

...