Skip to content

Продуктивність

🇬🇧 English | 🇺🇦 Українська

Публічних чисел FPS, пам'яті чи bandwidth для production-сцени поки немає. Нижче — фактична вартість кожної частини за реалізацією 1.0: скільки разів вона оновлюється, які запити до фізики робить і що передає мережею. Це параметри коду, а не результати benchmark; вимірюйте власну сцену.

Частоти

FocusUpdateHz і PoseReplicationHz незалежні; обидва початково дорівнюють 30 Гц. Перше налаштування обмежує пошук фокуса кожної руки, друге — надсилання одного пакета поз активних рук pawn. Для пакета використовується частота першого активного interactor. Значення 20 Гц зменшує відповідно кількість трейсів або мережевих RPC, але збільшує затримку оновлення. Локальне відстеження руки й solver працюють кожен кадр.

Вартість компонентів

Частина Де працює Частота Запити до фізики Мережа
Фокус UInteractorComponent Машина гравця FocusUpdateHz на руку 1 line trace або 1 sweep + 1 line trace; якщо доступної для захоплення цілі немає — ще стільки ж для Interact. Ближній пошук: 1 overlap-сфера + 1 line trace на кожного кандидата —
Пакет поз Віддалений клієнт → сервер PoseReplicationHz на pawn На сервері 1 line trace на кожну відстежувану руку 1 ненадійний RPC з усіма руками
Запит дії Клієнт → сервер За вводом Перевірка пози + 1–2 трасування 1 надійний RPC туди й 1 назад
UInteractionManipulationComponent Усі машини Щокадру, поки предмет тримають, він рухається чи симулюється; у спокої — раз на IdleUpdateInterval (0.5 с), з миттєвим пробудженням від руху Немає; у режимі Physics — PhysicsHandle під час хвату State позначається зміненим лише при реальній зміні; позиція квантована до 0.01 см, поворот — стиснутий FRotator
AInteractionMasterItem Клієнти й listen-сервер 10 Гц Читання overlap proximity-сфери (350 см) —
UInteractionDockComponent Сервер 10 Гц 1 overlap-сфера; на кожного кандидата 1 line trace Occupant
UInteractionBowComponent Сервер Щокадру, поки лук тримають; пошук стріли — 20 Гц 1 overlap-сфера при пошуку NockedArrow, DrawFraction
UInteractionStrikeComponent Сервер Щокадру, поки предмет тримають До 12 × 17 sphere sweep за кадр при швидкому замаху; зазвичай кілька —
AInteractionSpearActor Сервер Лише під час польоту — Через snapshot маніпуляції

Фокус спершу шукає доступну ціль захоплення; якщо її немає, перевіряє звичайну взаємодію. Кожен line trace виконує один запит, сферичний sweep додає перевірку видимості контакту, а near interaction перевіряє overlap-кандидатів. Надійні RPC використовуються для дій, ненадійні — для періодичних поз. Пакет із поточними позами також додається до запиту дії.

Що зростає з кількістю предметів

  • Тік маніпуляції. Компонент тікає щокадру лише тоді, коли є робота: предмет тримають, ним керує зовнішній драйвер, тіло симулюється й не спить або клієнт ще наближає позу до серверної. Нерухомий предмет перевіряє стан раз на 0.5 с і прокидається від будь-якої зміни трансформації чи пробудження фізичного тіла. Сотні предметів, що лежать, майже не займають game thread.
  • Реплікація. Під час руху (утримання, політ, симуляція) знімок змінюється й надсилається з частотою мережевого оновлення актора. Зміни, менші за 0.01 см, 0.01° чи 0.001 масштабу, не позначаються. Нерухомий предмет нічого не надсилає; якщо в збірці ввімкнено push model, сервер навіть не порівнює його незмінний знімок (див. таблицю порад нижче).
  • Master item. Кожен предмет раз на 0.1 с перевіряє proximity-сферу. Для тисяч предметів використайте AInteractionPhysicsActor і централізований HUD, proximity culling або власний presenter. Наївний tick кожного master item не заявляється оптимальним для тисяч предметів.
  • CCD. AInteractionPhysicsActor вмикає CCD, щоб кинуті предмети не пролітали крізь тонкі стіни. Для численних дрібних предметів, які не кидають, CCD можна вимкнути в нащадку.

Практичні поради

Ситуація Що зробити
Багато рук або гравців PoseReplicationHz = 20; для desktop-гравця з одним interactor достатньо 20
Повільні цілі, великі сцени FocusUpdateHz = 20, вузький TraceDistance, окремий TraceChannel лише з потрібними об'єктами
Багато вільних предметів Зменшіть Net Update Frequency акторів-предметів і налаштуйте relevancy; для статичних декорацій не додавайте маніпуляцію взагалі
Важкі сцени з фізикою PostThrowBehavior = DisablePhysicsFixedTime для предметів, які мають зупинитися гарантовано
AI-pawn з interactor Зменшіть FocusUpdateHz: на сервері AI шукає фокус так само, як гравець
Удари ребром Коротке ребро й більший EdgeRadius зменшують кількість sweep; кадри, у які предмет не рухався, пропускаються
Сотні предметів на рівні Залиште типовий IdleUpdateInterval; збільште його для декорацій, які рідко чіпають
Багато мережевих предметів Увімкніть push model: net.IsPushModelEnabled=1 у [SystemSettings] файлу DefaultEngine.ini. Editor-збірки підтримують його завжди; для гри й dedicated server додайте bWithPushModel = true у їхні Target.cs (це потребує unique build environment, тобто рушія, зібраного з вихідних кодів)

Як вимірювати

  1. Unreal Insights: запустіть гру з -trace=default,net -NetTrace=1 і подивіться час TickComponent маніпуляції, interactor і master item у game thread.
  2. stat game і stat physics у консолі показують загальний час тіку й фізичних запитів.
  3. Network Insights у тому самому трейсі (канал Net) показує розмір і частоту ServerUpdatePoses та реплікації State.
  4. Для мережі в PIE додайте затримку й втрати: Net PktLag=100, Net PktLoss=5.

Панель налагодження (15) нічого не коштує, поки закрита: журнал відповідей лише записує події OnActionResult. Відкрита панель оновлює числа чотири рази на секунду. У Shipping модуль не реєструє нічого. Поточні межі моделі описані на сторінці Обмеження та відомі проблеми.