?

Log in

No account? Create an account
Пршу помощи зала. - Sitting on the top of the mushroom.
November 10th, 2012
03:15 pm
[User Picture]

[Link]

Previous Entry Share Next Entry
Пршу помощи зала.
Я окончательно запутался и прошу помощи зала.

Есть некая игра, многомерные шахматы в реальном времени.
Есть пользователи, подключающиеся к серверу игры.
Есть каналы связи, которые могут сбоить и барахлить, ибо мир не совершенен.
Есть объекты в игре, которые могут меняться сами по себе или из-за действий пользователя.
Есть желание написать все это красиво, правильно, гибко и способным к расширению. Чтобы при желании можно было дописать свою игровую логику и пользоваться платформой. Хочешь - моделируй нормальную сеть, хочешь - Матрицу из Shadowrun. Да, все началось именно с того грешного Shadowrun, вы правильно поняли.
Есть желание написать так, чтобы клиент для сети работал на разных мобильных устройствах. То есть использовать, например, .NET Remoting очень хочется, но нельзя, ибо не слышал я о поддержке его для java, а без java мы теряем множество мобильных устройств.

Простейший вариант, как это делают почти все flash игры - ставим web-сервис и раз в секунду спрашиваем, есть ли изменения в игровой реальности. Я так делать не хочу - частые запросы от кучи игроков могут положить канал, а редкие запросы не дают возможности быстро реагировать на события. Что для персонажа, в общем случае. может быть смертельно опасно.

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

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

Current Location: в кресле
Current Music: тишина
Tags:

(15 comments | Leave a comment)

Comments
 
[User Picture]
From:cgvictor
Date:November 10th, 2012 12:03 pm (UTC)
(Link)
Ты не написал здесь, что будет за задача и где потенциально/реально уже намечаются грабли.
А оптимизировать то, что еще/уже не работает - затея гниловатая.

Если вопрос про коннекты, то посмотри на длинные соединения (как делают чуть более продвинутые тонкие игры).
Только вопрос про синхронизацию и передачу игрового состояния лежит немного в другой плоскости - и копий там поломано изрядно; а чем тебя не устроили существующие направления решений - пока не видно.
[User Picture]
From:randir_spb
Date:November 10th, 2012 02:21 pm (UTC)
(Link)
Сферическая задача в вакууме - нечто подобное MUD, с легко заменяемой моделью мира.
С существующими решениями проблема простая - я их не видел, а те реализации MUD, которые ввидел, мягко скажем, тогда остались мной не поняты. Мало знаю про имеющиеся решения, в общем.
Так что за пинок в правильном направлении буду признателен.
Вопрос с синхронизацией состояния я уже решал когда-то и по граблям попрыгал, но оно было в рамках одной локальной сети, там возможность быстро крикнуть "всем стоять!" помогала. Да, это было чуть-чуть до появления .NET.
[User Picture]
From:cgvictor
Date:November 10th, 2012 02:40 pm (UTC)
(Link)
Да пока хз, куда пинать.

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

На практике каждая из этих задач в отдельности и так не решаемая. Поэтому перефразируем:
- "слить состояние" целиком и мгновенно физически невозможно, ибо канал и время → слить на клиент дельту состояния мира в той части, которая потенциально доступна клиенту
- "возможность взаимодействовать с миром" для всех одновременно это sync hell; → дать возможность менять ограниченный объем мира и видеть нескольких заранее определенных игроков/ботов (и возможно даже соединить их напрямую)
- "убедиться, что состояние одинаковое" на разных каналах и даже вычислениях в проце?? → убедиться, что состояние мира на клиенте в какой-то его видимой/доступной части находится в рамках заданной погрешности от мастера

Вот так уже можно решать. Только по большинству вопросов серебряной пули все равно нет.

++ если тебе под .net, посмотри туториалы по XNA, там есть и про малтиплеер.
[User Picture]
From:pek9
Date:November 11th, 2012 05:51 pm (UTC)
(Link)
Извините за мысли далекого от программирования. Но у вас все же мозго-штурм. А можно для увеличения скорости обработки раскидать составляющие реальности на несколько серверов. Просто это могло бы позволить общитывать реальность частями. А если канал забарахлил - ну бывает. Осталось скажем дерево без листочков голым, потому, что листья на другом серваке считаются. Но и делов то - откинуть уже не нужное в связи со сбоем, а хорошо посчитанное и ложащееся в контекст развития вирт-реальности вывести. На следующем шаге листочки - вот они! Вуаля!
[User Picture]
From:randir_spb
Date:November 11th, 2012 08:25 pm (UTC)
(Link)
Нет, это плохая идея.
На расходы по синхронизации между серверами уйдет слишком много ресурсов, по-моему.
Плюс, пока предполагаются относительно небольшие вселенные, ради которых нет смысла создавать сеть серверов.
[User Picture]
From:cybercat
Date:November 11th, 2012 11:15 pm (UTC)
(Link)
В пределах тысячи человек вполне хватит одного сервера. Если будет больше - делить по виртуальным локациям. Это всё уже в MMORPG отработано
[User Picture]
From:pek9
Date:November 12th, 2012 10:04 am (UTC)
(Link)
Эхх, было бы здорово вообще технологию сновидений разработать, когда случайый предмет может быть ключом к перегрузке характеристик предлагаемого мироздания.
[User Picture]
From:cybercat
Date:November 10th, 2012 12:08 pm (UTC)
(Link)
Javascript, AJAX и браузер на стороне клиента. Сервер - на чём тебе привычнее.
[User Picture]
From:randir_spb
Date:November 10th, 2012 02:14 pm (UTC)
(Link)
И как сервер сообщает клиенту, что его убило метеоритом?
[User Picture]
From:cybercat
Date:November 10th, 2012 02:21 pm (UTC)
(Link)
Не метеоритом, а кометой
[User Picture]
From:randir_spb
Date:November 10th, 2012 02:24 pm (UTC)
(Link)
О, хорошо пнул, спасибо.
offtopic: когда вам тепловентилятор и скальпель вернуть?
[User Picture]
From:cybercat
Date:November 11th, 2012 11:16 pm (UTC)
(Link)
Как время будет - так и возвращай. Отзвонись только, когда тебя ждать...
[User Picture]
From:abuberman
Date:November 13th, 2012 02:02 pm (UTC)
(Link)
Ну, собственно, оба варианта вокруг тебя уже порхают:

- либо ты раз в дельта-тэ принимаешь HTTP-запрос и отвечаешь на него. Хочешь через аякс, не хочешь - сам руками. Потенциальные траблы:
--- Много запросов, начало/конец каждого нужно обрабатывать;
--- Пинг (особенно если речь идет о мобильных платформах) может исчисляться тысячетактиями, со всеми вытекающими проблемами вида "отстал я от жизни";
--- Отваливание игрока из игры может случаться спонтанно и непредсказуемо (таймаут, конечно, решает, но если нужно держать живой область окрест игрока - это может оказаться критичным при высокой нагрузке).

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

Да, (не)кстати: планируется ли реализация системы наблюдателей? В смысле, будет ли в лесу падать дерево, если этого никто не видит? Или - альтернативно - дерево не будет падать, просто вместо падающего дерева появится уже упавшее.

Ещё некстати: для борьбы с проблемами медленного соединения можно принципиально внести в механику какой-то "лаг управления", при котором персонаж всегда реагирует на команды с запаздыванием. Это придает взаимодействиям между игроками определенный стратегический шарм.
[User Picture]
From:randir_spb
Date:November 13th, 2012 02:48 pm (UTC)
(Link)
Видимо, это будет вечно живое и воскресающее long poll.
Асинхронность предполагается, длительные падения канала можно в наглую объявить частью игрового процесса - но именно длительные падения, после кратковременных клиенту просто приходит текущее состояние себя и мира вокруг.
Как я понял, при long poll картинки и прочая статическая красота должны ходить вообще с отдельного домена, иначе кривые ограничения мешают жить.
И у нас тут киберпанк и информационная сеть. То есть дерево или еще стоит или уже лежит.
Про лаг управления подумать надо, идея мне нравится.
[User Picture]
From:abuberman
Date:November 13th, 2012 03:04 pm (UTC)
(Link)
Угу... Но насчет падения дерева - это я не уверен, может оно падать, если на него кто-нибудь смотрит :) И особенно, если этот кто-то стоит непредусмотрительно близко и как раз в направлении падения.

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

Если вдруг понадобится ещё одна пара кодящих (жабу квакающих) рук - обращайся, что ли.
Powered by LiveJournal.com