Перейти до основного вмісту
Як працює 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, адмін-панель його покаже, а кодогенерація створить код для кожного біндингу. Див. Схема в коді.
  • Модулі поєднуються, а не успадковуються. Як саме і що тут означає «успадкування», описує сторінка Успадкування і композиція.