Многопользовательский сервер для приложения iPhone, использующий устройство в качестве сокет-сервера

Я работаю над многопользовательским приложением для iPhone, которое позволяет до 6 пользователей подключаться и играть в «реальном времени». Я искал размещенные и не размещенные серверы сокетов (SmartFox, ElectroServer, Photon / Neutron, ProjectDarkstar), и мне интересно, есть ли у кого-нибудь рекомендации по услугам или реализации? Кто-нибудь имеет представление о том, что такая игра, как Zynga's Live Poker, использует для этого типа функций или какое оборудование может вам понадобиться?

Некоторые подвопросы:

  1. Игра пошаговая. Было бы разумнее использовать AMF и опросить сервер или мне следует выбрать маршрут на основе сокетов? В настоящее время меня беспокоят ограничения на количество одновременных подключений и стоимость хостинга.

  2. Можно ли «транслировать» устройство как сокет-сервер? то есть, как только я подключу все свои плееры, могу ли я выделить одно из 6 устройств в качестве сервера сокетов и протолкнуть все коммуникации через это устройство? Это было бы безумием? Это позволило бы обойти проблемы параллелизма, и мне нужно было бы полагаться только на службу сервера сокетов в качестве лобби для начального соединения. Выделенный пользователь останется на связи, чтобы облегчить взаимодействие игры с сервером.


person typeoneerror    schedule 01.03.2010    source источник
comment
Вы хотите, чтобы люди играли по локальной сети (Bluetooth или Wi-Fi) или через Интернет? Если первое, то рассматривали ли вы возможность использования GameKit?   -  person Felixyz    schedule 02.03.2010
comment
Оба. Я буду использовать GameKit для игры между устройствами, но я также хочу поддержать функцию поиска игры в Интернете.   -  person typeoneerror    schedule 02.03.2010


Ответы (1)


1.

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

Как создать чат сервер, который не управляется опросом?

COMET (отправка сервера клиенту) на iPhone

Я не знаю, зачем вам использовать AMF. Почему не JSON? Или, может быть, HessianKit?

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

Если вы хотите, чтобы пользователи играли по локальной сети, вам следует подумать об использовании GameKit.

person Felixyz    schedule 02.03.2010
comment
На №2. Есть ли ресурсы о том, как начать это делать? Я проверял нашу RakNet (jenkinssoftware.com) и думаю, что это может сработать, но я далеко от эксперта по C, поэтому я не уверен, смогу ли я этого добиться. Спасибо за понимание. - person typeoneerror; 02.03.2010
comment
Возможно, это может быть проще, чем вы думаете. Вам, вероятно, не нужна полноценная сетевая библиотека для игр. Я бы сделал это так, чтобы запрограммировать приложение так, чтобы входные данные, логика и экранное представление были полностью разделены. Затем напишите фиктивный класс совместного игрока, который тупо имитирует элементы управления второго игрока. Когда это сработает, подключите GameKit, чтобы получать фактические управляющие события с этого уровня. Когда это сработает, создайте сервер с помощью Google App Engine и используйте опрос для получения обновлений состояния. Опять же, это должно взаимодействовать только с той частью вашего кода, куда передаются входные события. - person Felixyz; 02.03.2010
comment
Что касается того, чтобы сделать одно из устройств сервером, вы просто произвольно решаете во время установления соединения, какое из них будет сервером (возможно, тот, который сам будет транслировать первым). Все остальные устройства не обновляют свой интерфейс в ответ на пользовательские события (за исключением простых вещей, таких как выделение кнопок), а отправляют их на сервер, а затем возвращают объекты событий, которые вызывают обновление интерфейса. Не поддавайтесь соблазну позволить каждому устройству обновлять свое состояние. (Это часто необходимо в играх в реальном времени, но это очень сложно осуществить.) - person Felixyz; 02.03.2010