Перейти до основного вмісту
Жива гра

Цю сторінку ще не перекладено — показано англійську версію.

Visibility

На 40 гравців снапшот усієї кімнати годиться. На 200 — уже ні. Хто що отримує, вирішує зона видимості. Це оголошений предикат, а не перемикач, який ви клацаєте для кожного об’єкта. Загальне розсилання й персональні пакети — два оголошені режими доставки однієї моделі, тож перейти з одного на інший можна налаштуванням, без переписування коду. Це оптимізація каналу, а не дозвіл: про дозволи читайте на сторінці Access & Roles.

Одну оголошену модель — предикат, шари, рівні деталізації — можна прочитати двома способами:

Загальне розсиланняПерсональні пакети
Що надсилаєусю кімнату, усімкожному гравцеві (player) — лише ту частину, яку вибирають його правила
Для чого підходитьдля невеликої кімнати; це режим за замовчуваннямдля натовпу, де розмір пакета має лишатися передбачуваним
Як читає оголошенняодин раз на кімнатудля кожного актора окремо

Те, що не повинно витекти, відсутнє в пакеті, а не сховане на клієнті. Платформа просто не надсилає ці дані, тому це властивість безпеки, а не економії трафіку.

Коли це потрібно

  • Ваші кімнати (room) переросли розсилання всієї кімнати: 200 гравцям потрібен для кожного клієнта власний потік даних про околиці, а не кожна дельта.
  • Стан не повинен витікати: туман війни й поля (field), доступні лише власникові, взагалі не слід надсилати, а не ховати на клієнті.
  • Кілька сесій ділять одну мапу (map) і не повинні бачити одна одну: шар — це ще один предикат.
  • Розмір пакета в натовпі має бути передбачуваним: обмежте кількість об’єктів і оголосіть порядок відбору, щоб «найближчі N» були обіцянкою, а не випадковістю щільності.
  • Гравець біля межі має бачити, що за нею: оголосіть, які сусідні області видно, бо за замовчуванням видно лише його власну.
  • Не потрібно, якщо кімната невелика. З цим упорається режим доставки загальним пакетом.

Хто що робить

АкторЩо робить на цій сторінці
schema-authorоголошує предикат видимості (visibility), ліміт об’єктів і порядок відбору, які сусідні області видно, і режим доставки
anyпідписується й отримує те, що пропускає зона; може сам собі знизити ліміт об’єктів в оголошених межах

Коротко

Правила радіуса й шару, оголошені на Tank; Ammo бачить лише власник — це вказано поруч із полем
[Entity("tank")]
[Visible(Radius = 60)]                           // spatial
[Visible(Rule.SameLayer)]                        // layers of one map
public class Tank
{
    [Sync] public Vector3 Position;
    [Sync(To = Scope.Owner)] public int Ammo;    // per-field scope
}
@Entity('tank')
@Visible({ radius: 60 })                       // spatial
@Visible(Rule.SameLayer)                       // layers of one map
export class Tank {
  @Sync() position!: Vector3;
  @Sync({ to: Scope.Owner }) ammo = 0;         // per-field scope
}
@entity("tank")
@visible(radius=60)                              # spatial
@visible(Rule.SAME_LAYER)                        # layers of one map
class Tank:
    position: Vector3 = sync()
    ammo: int = sync(to=Scope.OWNER)             # per-field scope
Незабаром — Go

Як оголошувати через атрибути в Go, поки не вирішено (O-1). Приклади з’являться, коли оберуть спосіб запису.

// multi-entry values are one quoted list (a specifier value is a single token)
UCLASS(PSEntity = "tank",
       PSVisible = "radius:60, rule:SameMapInstance")   // spatial + instances of one map
class UTank : public UObject
{
    GENERATED_BODY()

    UPROPERTY(PSSync)                  FVector3f Position;
    UPROPERTY(PSSync = (To = "Owner")) int32     Ammo;   // per-field scope
};
// declarations compile into the same pushed model — playserv push from the UE project or CI
Unity C# is the same C# API here — ті самі атрибути компілюються в Unity на базовій версії 2021.3 — синтаксису C# 12 тут немає
[Entity("tank")]
[Visible(Radius = 60)]                           // spatial
[Visible(Rule.SameLayer)]                        // layers of one map
public class Tank
{
    [Sync] public Vector3 Position;
    [Sync(To = Scope.Owner)] public int Ammo;    // per-field scope
}

Модель

Що оголошує правило видимості.

Що оголошуєЩо це
предикатсаме правило, записане тією самою мовою предикатів, що й предикати доступу та умови переходів. Радіус, екземпляр мапи, команда й володіння — окремі випадки предиката, а не окремі механізми: така мова в контракті рівно одна
ліміт об’єктів і порядок відборуправило може обмежити кількість об’єктів, і тоді порядок відбору оголошують, а не вгадують. «Найближчі N» — це предикат плюс сортування за відстанню плюс ліміт. Самим предикатом цього не виразити: предикат відповідає на питання «чи підходить цей рядок», а не «який із відповідних ближчий»
сусідні областічи видно об’єкти із сусідньої кімнати або сусіднього екземпляра мапи, і які саме. Ніколи не діє неявно: без оголошення область — та, у якій перебуває одержувач
режим доставкизагальний пакет: усім те саме, дешево для CPU. персональний пакет: кожен одержувач отримує свій, за своєю зоною; дорого для CPU, але необхідно, коли гравців багато

Що справджується для будь-якої зони.

ЗавждиЩо це
видимість— не дозвіл (permission): те, що ховає зона, може бути доступне за дозволом, і навпаки (див. нижче)
одержувачможе знизити ліміт — у межах оголошеного максимуму й не нижче оголошеного мінімуму. Предикат однаковий для всіх, чий контекст йому відповідає, а розмір пакета — клопіт одержувача
обрізанняпомітне: одержувач дізнається, що пакет обрізано і за яким порядком. Мовчки обрізати заборонено — таке обрізання не відрізнити від того, що об’єктів більше немає
деградаціяоголошена: коли бюджет на збирання персональних пакетів вичерпано, платформа переходить на загальний пакет так, як оголошено, а не починає довільно втрачати одержувачів
форма пакета— слабка обіцянка: бажано, щоб розмір і склад пакета не видавали існування прихованих об’єктів

Видимість — це не дозвіл

Зона — це оптимізація каналу, а не контроль доступу. Не змішуйте їх: інакше налаштування туману війни непомітно розширить права, або права почнуть залежати від відстані. Розмір пакета може підказати, що приховані об’єкти існують. Тож там, де їхнє існування не повинно витекти, використовуйте дозволи з Access & Roles, а не зону.

На питання «хто це бачить?» і «що саме вони бачать?» можна отримати відповідь запитом. Вартість персональних пакетів — повноцінна метрика: її можна прочитати і в коді, і в панелі.

Помилки

  • Неоголошена ціль підписки (subscription) — відмова під час валідації.
  • Немає дозволу на підписку — відповідь forbidden або not found, залежно від того, чи є таємницею саме існування цілі: відмова не повинна видавати те, у чому відмовляє.
  • Позиція відновлення, яку не вдалося розібрати, — це некоректний запит, а не мовчазний перезапуск із поточного моменту.
  • Підписка, яку закрила платформа, і вичерпаний ліміт підписок — обидва випадки є конфліктом.
  • Розширити подання (view) можна лише з fn. Коли сесія гравця намагається видати розширене подання чи налаштувати рівні деталізації (detail tier), платформа відмовляє з forbidden, і подання не змінюється. Клієнт глядача не може розширити власні видані права (grant).
  • Екземпляр, якого немає в поданні того, хто викликає, відповідає not found — так само, як неіснуючий. Відповідь forbidden підтвердила б, що за стіною щось є.
  • Читати вартість персональних пакетів можна лише з fn adm : із хмарної функції або панелі, але ніколи з клієнта.

Обмеження

Конкретні числа з’являться в розділі про обмеження платформи, а що відбувається на кожній стелі, визначено вже зараз.

  • Вартість персонального пакета: коли бюджет вичерпано — оголошена деградація до загального пакета зі сповіщенням, але ніколи не довільна втрата одержувачів.
  • Об’єктів на правило: кількість обмежена, з оголошеним порядком і видимим прапорцем обрізання.
  • Підписок на актора: нову платформа відхиляє, а наявні працюють далі.
  • Розмір дельти: дельту розбивають, а не обрізають, і розбиття помітне.
  • Частота надсилання: це верхня межа, а не гарантія.