Оптимізація світів, побудованих гравцями: стратегія рендерингу SEED в Unity

  • PublicPublic
  • 06 Nov, 2026
Оптимізація світів, побудованих гравцями: стратегія рендерингу SEED в Unity

SEED - це персистентна MMO-пісочниця від Klang Games, розроблена на Unity. Дія розгортається на віддаленій планеті, де гравці керують автономними персонажами - ростками. У грі є економіка, керована гравцями, будівництво суспільства та безперервне розширення світу, яке триває навіть після виходу гравців із гри. Кожна нова будівля, дерево або персонаж, додані гравцями, збільшують навантаження на рендеринг у клієнті Unity, який має обробляти цей динамічний стан на широкому спектрі апаратного забезпечення - від потужних ПК до смартфонів. Симуляція працює на виділених серверах, а клієнт відповідає за рендеринг стримінгового стану та передачу дій гравця, таких як кліки та рух камери.

Арт-стиль SEED навмисно стилізований і низькополігональний: більшість даних про поверхні зберігається безпосередньо в геометрії, а не в текстурах. Такий підхід зменшує витрати на шейдинг та використання пропускної здатності пам'яті, що критично важливо для продуктивності на мобільних пристроях. Будівлі зводяться з малих цегляних модулів на сітці з кроком один метр. Кожен воксель, розміщений гравцем, розгортається приблизно в 15 модулів, при цьому інтер'єри генеруються лише під час перегляду. Найбільше суспільство на густонаселеному острові налічує 172 будівлі, близько 12 500 вокселів і 190 000 модулів. Вони рендеряться за допомогою BatchRendererGroup, де завдання виконуються в C# Job System і компілюються компілятором Burst, що забезпечує ефективність навіть при великій кількості об'єктів.

Klang Games використовує Universal Render Pipeline (URP) і суворо дотримується стандартних рішень Unity, щоб гарантувати сумісність із майбутніми оновленнями. Гра зараз працює на Unity 6.3, і команда оновлює рушій приблизно раз або двічі на рік, щоб отримати доступ до нових функцій рендерингу. Кастомні ефекти реалізуються через власні renderer features, а не шляхом заміни URP, що дозволяє зберегти базові механізми, такі як SRP batching та GPU Resident Drawer. Для природних об'єктів використовується Shader Graph зі стандартним шейдером Lit, а для персонажів - Unlit-шейдери з кастомним проходом освітлення. Ця стратегія гарантує, що створення власних шейдерних графів не ламає базові механізми продуктивності, створюючи стабільну основу для світу, де складність рендерингу визначають гравці.

Взаємодія з густим середовищем, створеним гравцями, вимагає точних методів вибору об'єктів. При наближенні гра використовує піксельно-точний вибір: об'єкти малюються в off-screen render target з унікальними ID, що дозволяє клієнту точно визначити об'єкт під курсором. На мобільних пристроях, де ввід через дотики менш точний, система перевіряє сусідні пікселі та показує список вибору, якщо виявлено кілька об'єктів. При віддаленні система перемикається на фізичний raycast, використовуючи Unity Physics для ініціалізації та запиту великої кількості коллайдерів для дерев, об'єктів та цеглинок будівель. Постійно працююче завдання визначає, чи перебувають об'єкти всередині будівель, щоб керувати шарами рендерингу та освітленням, що дозволяє, наприклад, вимикати GameObjects або налаштовувати видимість залежно від розташування гравця всередині структури.

Оптимізація продуктивності сильно спирається на реалістичні дані зі знімків живих серверів, які відновлюються локально для тестування великих суспільств. Цей підхід показав, що на ПК гра часто стикається з обмеженням CPU через відправку draw calls, попри використання GPU Resident Drawer. Проблема була пов'язана з анімованим перехресним затуханням LOD, яке заважало інстансингу об'єктів. Вимкнувши анімаційну частину та використовуючи ручні переходи, команда повернула інстансинг, що значно зменшило навантаження на CPU. На мобільних пристроях головним обмеженням є пам'ять, а не CPU. За допомогою Memory Profiler команда виявила проблеми, такі як дублювання текстур та надто великі колекції C#. Щоб вирішити питання використання пам'яті для геометрії, вони замінили класичні LOD Groups на Mesh LOD в Unity 6.2. Ця функція зберігає всі рівні деталізації в одній меш-моделі, що зменшує споживання пам'яті та спрощує управління активами для мобільних платформ.