Перейти к основному содержимому
Как работает SDK

Эта страница ещё не переведена — показана английская версия.

Как устроен SDK

Как SDK написан и как он работает. Почему одна и та же идея в Python и в Unreal C++ выглядит немного по-разному и что стоит между вашим вызовом и сетью.

От общего к частному

SDK — это единый дизайн, который сужается двумя способами, и главное здесь — порядок: ничто не опускается на уровень ниже, пока уровень выше может это выразить.

УровеньЧто здесь живёт
Общие принципыОдинаковы во всех биндингах. Поведение объявляется атрибутом рядом с тем, что оно описывает. Любое объявление (declaration), которое вы отправляете, появляется в админ-панели. Ваш код обращается только к модулям.
Особенности языкаТолько то, что парадигма языка не позволяет выразить общим способом. В C# есть атрибуты, в Python — декораторы: объявление одно и то же, просто записано так, как в каждом языке уже принято записывать эту идею. Если в языке такой конструкции нет, объявление передаётся иначе, и этот способ прямо называется там, где он применяется, а не подразумевается.
Особенности движкаТолько то, что игровой движок перестраивает поверх своего языка. Unreal C++ — не обычный C++: у него своя объектная модель и своя рефлексия на этапе сборки. Поэтому объявление там живёт внутри собственного макроса рефлексии движка, в той позиции, где этот макрос и так принимает спецификаторы. Unity C# — тоже не серверный C#: среда выполнения там старее, а базовая библиотека меньше.

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

Как он работает — от вашего кода вниз

Код игры видит модули, и на этом его словарь заканчивается.

  • Модули — то, к чему вы обращаетесь. Они образуют граф, а не дерево, а что это даёт, описано на странице Наследование и композиция.
  • Четыре примитива — то, из чего собраны модули: события, RPC, данные и подписки, группы. Комната, чат и пул подбора игроков (matchmaking) устроены одинаково: все они — примитив группы, только с разными правилами.
  • Хаб находится ниже, и вы никогда его не вызываете. Это внедрение зависимостей, монтирование модулей, пользовательская сессия, восстановление состояния и качество доставки сообщений. Отдельно о нём говорится только на странице Под капотом.
  • Транспортные адаптеры (transport adapter) лежат в самом низу, по одному на протокол, и хаб полностью их скрывает. Их будет несколько — WebSocket, наш собственный UDP, HTTP, — и какой из них понесёт вызов, ваш код не выбирает и даже не замечает.

О доставке модуль сообщает только одно — качество доставки: at-least-once или at-most-once. Транспорт под ним может смениться, а ваш код останется прежним.

Что это даёт

  • Один SDK, а не клиентский и серверный. Что может вызов, определяют выданные актору права (grant), а не флаг сборки. Подробнее — на странице Кто принимает решения.
  • Объявление — исходная точка для всего остального. Загрузите его, и появится типизированный API, админ-панель его покажет, а следом сгенерируется код для каждого биндинга. См. Схема в коде.
  • Модули складываются, а не наследуются. Как именно и что здесь значит «наследование» — на странице Наследование и композиция.