Photon - Operations & Events ~ Revelations

Photon - Operations & Events ~ Revelations

Сообщение Fratyr 31 май 2012, 17:40

Привет, :-h

Сегодня, под предлогом обсуждения и в целях развития этой ветки форума, которая слишком уж тухленькая, я попытаюсь выманить немного ваших знаний о Фотоне для благих целей! :ymdaydream:

Задавал вопрос как на офф.форуме, так и на stackoverflow - молчат. :|

В общих чертах, мой вопрос можно истолковать так:
Что такое Operations и Events в Фотоне, для чего они нужны и на каких живых примерах их можно использовать? #-o

Если понимаю правильно, то в кратце:
Операция - запрос посылаемый клиентом на сервер
Событие - событие рассылаемое сервером одному, группе или всем клиентам

Углубляемся :-B
Учитывая, что операций например, может быть всего 255, потому что передаются байтом и не рекоммендуется раздувать это, я предположил, что разработчики Фотона уверены в том, что в 255 операций уложится любая игра.
Тогда вопрос... А как тогда различать запросы? И чем тогда является операция? ~x(

Я опять предположил, что операция в таком случае, является неким каналом для потока данных между клиентом и сервером, в одной операции могут содержаться разные запросы, которые можно различать посредством channelID, но я могу жестко ошибаться и тут мне нужна ваша помощь понять это.
Кстати, в таком случае, если я прав, с терминологией проблемы. Тогда вместо операций должны быть channelID, и внутри него надо использовать операции (или проще говоря какой-нибудь GAME FLOW), например: "Игрок А хочет ударить Игрока Б". :-B

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

Я могу начать практиковаться, но боюсь, что научусь сам, без помощи, тому, что является грехом и неверным в корне.
Поэтому, может быть, тот кто имеет опыт с Фотоном и писал уже работающие вещи скажет, для чего операции, каналы, события, в чем их смысл? Как это применить в игре? Не в плане кода, с этим все хорошо, а в плане логики.
Чем в моем случае будет являться операция, а чем канал...

Можно использовать пример для обсуждения: Есть набор функций которые управляют персонажем. Идти, бежать, сидеть, прыгать, ударить. У каждой функции есть свои параметры. Куда идти, куда бежать, как высоко прыгать, где точка приземления, можно ли сесть там где хотят сесть, кого ударить и.т.п
Вопрос - все эти функции являются операциями по отдельности, или они являются одной операцией, группа похожих по смыслу функций, которые различаются по channelID? или channelID это тоже слишком высокий уровень для столь низкоуровневых функций?

В общем.. я в печали, больше некому мозг сверлить. Помогите, помогите, с меня пиво.. Если кто будет проездом в Израиле =)

Спасибо.
Fratyr
UNец
 
Сообщения: 28
Зарегистрирован: 13 сен 2011, 22:35

Re: Photon - Operations & Events ~ Revelations

Сообщение gnoblin 31 май 2012, 18:16

Привет!

В целом я бы обратил внимание на Photon Unity Networking ).

По "обычному" фотону:
Каналы нужны для посылки разнотипной информации,
например в основном канале шлется инфа о передвижении игроков, во втором чат-сообщения (afaik, reliable сообщения задерживают unreliable cообщения когда проходят по одному каналу).
Больше 2-3 каналов я так понял никто не использует.

Через Operations ты шлешь инфу с клиента (причем можешь использовать OpResponse, можешь не использовать), Events служат для пересылки инфы с сервера.

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

ты можешь слать какой-то id в сообщении - тогда можешь использовать сколько хочешь операций :).

Тогда вопрос... А как тогда различать запросы? И чем тогда является операция? ~x(

тут я тебя не понял

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


Операция это запрос с клиента (либо с ответом, либо без) - в целом да, ошибаешься жестко (см. выше про каналы).

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

ну шлешь те данные которые тебе нужно переслать :)

Можно использовать пример для обсуждения: Есть набор функций которые управляют персонажем. Идти, бежать, сидеть, прыгать, ударить. У каждой функции есть свои параметры. Куда идти, куда бежать, как высоко прыгать, где точка приземления, можно ли сесть там где хотят сесть, кого ударить и.т.п
Вопрос - все эти функции являются операциями по отдельности, или они являются одной операцией, группа похожих по смыслу функций, которые различаются по channelID? или channelID это тоже слишком высокий уровень для столь низкоуровневых функций?


channelID один и тот же, клиенты шлют серверу операцию "хочу идти туда-то"/"я ударил кого-то" (авторитарность сервера мы тут не обсуждаем пока), сервер шлет клиентам события "он тут"/"ударил того-то тем-то туда-то". Фотон штука гибкая - несколько действий могут быть одной операцией (с полем byte id для типа действия, например), могут быть отдельными операциями (аналогично про события).
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Photon - Operations & Events ~ Revelations

Сообщение Fratyr 31 май 2012, 19:01

Тогда вопрос... А как тогда различать запросы? И чем тогда является операция?


Ну я имел в виду, какой смысл в операциях и их лимите до 255, если можно по идее все запросы отправлять в 1-2 операциях и просто в парамерах передавать разные айди запросов.

По сути я не могу получить ответ на - В чем смысл операции и возможности посылать до 255 разных?
Я знаю, что операция это запрос клиента серверу. Но зачем их так много в таком случае?

Сделаю я операцию 1 - она будет гонять запросы с разными айди для системных вещей, как логин, логаут, регистрация
Операция 2 - все что связано с сообщениями
Операция 3 - вся игровая механика

И зачем тут 255 вариантов? Если понимать четко, в чем их истинное предназначение - тогда будет и ответ на мой вопрос, вот я и ищу везде этот ответ. ;-)

..Photon Unity Networking - Так ПУН вроде работает только с облаком которое предоставляют ExitGames?
Как-то хочется все же писать на чистом Фотоне, понимать, что делаешь, как с серверной стороны, так и с клиентской в самом Юнити.
Fratyr
UNец
 
Сообщения: 28
Зарегистрирован: 13 сен 2011, 22:35

Re: Photon - Operations & Events ~ Revelations

Сообщение gnoblin 31 май 2012, 21:35

можно у себя держать сервак для PUN

255 это просто лимит, скока хочешь стока и используешь - мистического смысла (кроме того что 255 влезает в 1 байт) нету ).
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Photon - Operations & Events ~ Revelations

Сообщение Gremlin13 02 июн 2012, 12:15

Сделаю я операцию 1 - она будет гонять запросы с разными айди для системных вещей, как логин, логаут, регистрация
Операция 2 - все что связано с сообщениями
Операция 3 - вся игровая механика

Как раз для этого используются каналы. А операции - это и есть те самые "логин", "логаут" и т.п. Я бы порекомендовал почитать про TCP & UDP, MTU, но если вкратце - что такое "команда"? Команда в терминологии Photon - это пакет, передаваемый по сети, просто набор байтов. Какая у этих пакетов будет структура - протокол - определяется разработчиком.
Допустим, мы делаем очередную ММО. В нашей игре богатый геймплей, навороченный сюжет и есть 2 команды, отправляемые с клиента на сервер. В нашем "Морском бою" мы можем передать две команды: координаты - X и Y, типа int - и отправить строку произвольной длины (текстовое сообщение). Как их отправить на клиенте - это понятно. А как принять? Вот получили мы массив байтов - что с ним делать? Какие там переменные, какова их длинна?
Чтобы решить эту проблему - ввели концепцию OpChar/OpCode, "номеров пакетов" и саму суть протокола, где код пакета позволяет узнать структуру, которая у него должна быть. Допустим, у пакетов выше будут коды 1 и 2 соответственно. Пакет №1 будет выглядеть как: ABC, где A - 1 (байт, опчар), B - 13 (4 байта, int, координата X), C - 15 (4 байта, int, координата Y). Пакет №2: ALS, где A - 2 (байт, опчар), L - 7 (небольшое отступление - строки могут быть переменной длинны, поэтому, как правило, в пакет включается информация о длинне конкретного сообщения, 4 байта, int), S - abcdefg (сама строка, 7 байт).
Таким образом, в стандартной реализации игрового протокола одна атомарная операция является одной командой Photon. Попробуй придумать структуру пакетов и - главное - как их считывать на стороне получателя используя только один opchar :) - и поймешь, почему вешать на один опчар несколько различных пакетов - плохая идея.
Из примера выше: допустим, мы не отсылаем opChar и у нас что-то посложнее, чем морской бой. У нас есть пакеты с информацией о: 1) строка сообщения в чате; 2) строка away сообщения; 3) сообщение в привате; 4) сообщение к kick message, которое получает клиент, когда его кикают. Структура у них будет соответственно одна и та же - LS (L - длинна, S - строка). Как их различить? Как не кикнуть игрока, когда его друг напишет ему в чате "привет"? :)
А протокол - это и есть набор этих самых пакетов с описанием их структуры - какие данные присутствуют в пакете и в каком порядке они расположены. Пакеты делятся на три группы - C<->S (могут отсылаться как клиентом серверу, так и сервером клиенту, например - сообщение в чате), C->S (отсылаются только от клиента к серверу, например, запрос на авторизацию с логином и паролем) и S->C (отсылаются только сервером клиенту, например - кик). Достаточно разделить на эти три группы - и сразу становится понятно какие пакеты необходимы: авторизация, передвижение, изменение в инвентаре и экипировке, различные текстовые сообщения и проч.

P.S: 255 пакетов практически в любой игре хватит за глаза.
P.P.S: Использовать Photon Cloud - не обязательно, можно поставить собственный локальный сервер.
Из readme Photon-Unity SDK писал(а):Before you use the "Loadbalancing" demos, enter your own "appId" into them. In the demo source, find
"<insert your appid here>" and replace it.
You can get an appId for our Cloud service for free by registering:
http://www.exitgamescloud.com

Alternatively host Photon yourself and use any appId.
To do so, setup a Photon Server and run the Loadbalancing instance. This provides the same logic as
the cloud does.
Download the server SDK here:
http://www.exitgames.com/download/photon

The affected demos have "Cloud" or "Loadbalancing" in their name are using a special server setup
with a "Master Server" and several "Game Servers".

Во Free лицензии для Photon'а до 100 одновременных пользователей - бесплатно.
домики деревяные набигают солдаты дворца и злодеи
Gremlin13
UNец
 
Сообщения: 8
Зарегистрирован: 30 май 2012, 05:06

Re: Photon - Operations & Events ~ Revelations

Сообщение Fratyr 02 июн 2012, 15:32

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

Gremlin13 вообще порвал мозг, но зато наконец-то я понял, что такое операции, можно двигаться дальше. :D
Fratyr
UNец
 
Сообщения: 28
Зарегистрирован: 13 сен 2011, 22:35

Re: Photon - Operations & Events ~ Revelations

Сообщение Gremlin13 02 июн 2012, 21:15

Я понимаю, что мое описание выглядит сумбурно :) Главное понять концепцию - по сети передаются не int, string, float и т.п., т.е. определенные типы данных, а массив байтов. Таким образом:
1) Сообщение имеет вид типа 01001011100010001000100 (двоичное представление, 0 или 1 - это 1 бит, 8 бит = 1 байт, минимальный размер памяти, занимаемый переменной в C# - это 1 байт, тип byte или boolean). То есть мы не можем знать где у нас, что и как расположено. Но мы можем читать байты последовательно и, считав начальные байты, узнать что у нас будет дальше - какого типа переменные (то есть сколько байт занимает) и в каком порядке они будут расположены.
2) Каждый тип данных в C# имеет собственный размер. Тип byte - 1 байт (0000 или 0001), тип integer - 4 байта (0100000110000001 например), тип float - 4 байт (0010000110000001), тип char (или один символ в строке) будет занимать 1 байт для таблицы ASCII и 2 байта для UTF-8, то есть строка вида "1ДRR", где "Д" - русская, будет занимать 5 байт (1+2+1+1) и т.п. Более подробно о размерах типов данных можно прочитать в MSDN
3) Пакеты могут приходить в произвольном порядке и не обязательно полностью за один раз. Условно - отправив строку из 300 символов на локальный сервер, подключившись через localhost, мы мгновенно получим тот самый пакет с 300 символами, потому что всё крутится через виртуальный интерфейс loopback на локальном ПК. В реальном мире - то есть в сети интернет - наши пакеты могут приходить разбитыми на части и с большой задержкой - сначала получим 100 символов, потом - еще 100, потом - еще 100. Мы должны понять, что получив в пакет, в котором указана длина строки 200 байт, а само содержимое пакета равно всего 100 байтам, нам необходимо дождаться остатка пакета в 100 байт, чтобы прочитать строку полностью.

В случае с Photon это происходит "за сценой": он сам конвертирует типы данных в байты, добавляет информацию о длине строки где нужно, а при получении пакета - преобразует массив байтов в "удобоваримый" вид. Подход, используемый в Photon, соответствует стандартным практикам и используется в практически любой работе с сетью, разве что - за исключением всяких домашних поделок типа Minecraft, где протокол отвратителен :).
Я участвовал в разработке C# эмуляторов для серверов Dark Age of Camelot (http://www.dolserver.net) и Minecraft (http://c-raft.com). Там не используются сторонние библиотеки, поэтому достигается лучшее понимание происходящего и сам код гораздо гибче и эффективней.
домики деревяные набигают солдаты дворца и злодеи
Gremlin13
UNец
 
Сообщения: 8
Зарегистрирован: 30 май 2012, 05:06


Вернуться в Photon

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2