Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Виправлення тремтіння, заїкання та затримки введення

Що таке тремтіння, заїкання та затримка введення?

Тримання і заїкання — це дві різні зміни видимого руху об’єктів на екрані, які можуть впливати на гру, навіть якщо вона працює на повній швидкості. Ці ефекти здебільшого помітні в іграх, де світ рухається з постійною швидкістю у фіксованому напрямку, як-от ранери чи платформери.

Затримка введення не пов’язана з тремтінням і заїканням, але іноді обговорюється разом. Затримка введення – це видима затримка на екрані під час виконання дій за допомогою миші, клавіатури, контролера або сенсорного екрана. Це може бути пов’язано з кодом гри, кодом двигуна або зовнішніми факторами (наприклад, апаратним забезпеченням). Затримка введення найбільш помітна в іграх, у яких для прицілювання використовується миша, наприклад іграх від першої особи. Затримку введення неможливо повністю усунути, але її можна зменшити кількома способами.

Розрізнення тремтіння та заїкання

Гра, що працює з нормальною частотою кадрів і не демонструє жодного ефекту, виглядатиме гладко:

../../_images/motion_normal.gif

Гра, що демонструє тремтіння, буде постійно тремтіти дуже непомітно:

../../_images/motion_jitter.gif

Зрештою, гра, яка демонструє заїкання, виглядатиме плавно, але кожні кілька секунд зупинятиметься або відкочуватиметься на кадр назад:

../../_images/motion_stutter.gif

джиттер

Існує багато причин тремтіння зображення. Найпоширеніша з них виникає, коли фізична частота гри (зазвичай 60 Гц) працює з роздільною здатністю, що відрізняється від частоти оновлення монітора. Перевірте, чи не відрізняється частота оновлення вашого монітора від 60 Гц.

Іноді лише деякі об'єкти тремтять (символ або фон). Це трапляється, коли вони обробляються в різних джерелах часу (одне обробляється на кроці фізики, а інше — на кроці очікування).

Цю причину тремтіння можна зменшити, увімкнувши physics interpolation у налаштуваннях проекту. Фізична інтерполяція згладжує оновлення фізики, інтерполюючи перетворення фізичних об'єктів між фізичними кадрами. Таким чином, візуальне представлення фізичних об'єктів завжди виглядатиме плавним незалежно від частоти кадрів та частоти тактів фізики.

Увімкнення фізичної інтерполяції має деякі застереження, про які слід знати. Наприклад, слід бути обережним під час телепортації об'єктів, щоб вони не інтерполювали між старою та новою позиціями, коли це не передбачено. Дивіться документацію Інтерполяція фізики для отримання детальної інформації.

Примітка

Увімкнення інтерполяції фізики збільшить затримку введення для поведінки, яка залежить від такту фізики, наприклад, руху гравця. У більшості ігор це, як правило, краще, ніж тремтіння, але уважно розгляньте це для ігор, які працюють з фіксованою частотою кадрів (наприклад, файтинги або ритмічні ігри). Це збільшення затримки введення можна компенсувати, збільшивши частоту тактів фізики, як описано в розділі Затримка введення.

Заїкатися

Заїкання може виникати з кількох різних причин. Одна з причин полягає в тому, що гра не може підтримувати повну частоту кадрів через вузьке місце процесора або графічного процесора. Вирішення цієї проблеми залежить від гри та вимагатиме optimization.

Ще однією поширеною причиною заїкання є заїкання компіляції шейдерів. Це трапляється, коли шейдер потрібно скомпілювати, коли вперше в грі з'являється новий матеріал або ефект частинок. Такий тип заїкання зазвичай трапляється лише під час першого проходження або після оновлення драйвера графіки, коли кеш шейдерів стає недійсним.

Починаючи з версії Godot 4.4, під час використання рендерерів Forward+ або Mobile, движок намагається уникнути заїкання компіляції шейдерів, використовуючи підхід убершейдерів. Щоб цей підхід був максимально ефективним, слід бути обережним під час проектування сцен та ресурсів, щоб Godot міг зібрати якомога більше інформації під час завантаження сцени/ресурсу, а не під час його першого відображення. Див. Зменшення затримок у компіляціях шейдерів (конвеєрів) для отримання додаткової інформації.

Однак, під час використання рендерера сумісності, цей підхід з убершейдером неможливо використовувати через технічні обмеження OpenGL. Тому, щоб уникнути заїкання компіляції шейдерів у рендерері сумісності, потрібно створювати кожну сітку та візуальний ефект перед камерою протягом одного кадру під час завантаження рівня. Це гарантуватиме, що шейдер буде компілюватися під час завантаження рівня, а не під час гри. Це можна зробити за суцільним 2D-інтерфейсом (наприклад, повноекранним вузлом ColorRect), щоб він не був видимим для гравця.

Примітка

На платформах, що підтримують вимкнення V-Sync, заїкання можна зробити менш помітним, вимкнувши V-Sync у налаштуваннях проекту. Однак це призведе до розривів зображення, особливо на моніторах з низькою частотою оновлення. Якщо ваш монітор підтримує цю функцію, розгляньте можливість увімкнення змінної частоти оновлення (G-Sync/FreeSync), залишивши V-Sync увімкненою. Це дозволяє зменшити деякі форми заїкання без появи розривів. Однак це не допоможе зі значними заїканнями, такими як ті, що спричинені заїканням компіляції шейдерів.

Змусити вашу відеокарту використовувати профіль максимальної продуктивності також може допомогти зменшити затримки за рахунок збільшення енергоспоживання GPU.

Крім того, заїкання може бути викликане базовою операційною системою. Ось деяка інформація щодо заїкання в різних ОС:

Windows

Відомо, що Windows може спричиняти заїкання у віконних іграх. Це здебільшого залежить від встановленого обладнання, версії драйверів та процесів, що працюють паралельно (наприклад, відкрита велика кількість вкладок браузера може спричинити заїкання у запущеній грі). Щоб уникнути цього, Godot підвищує пріоритет гри до "Вище за норму". Це значно допомагає, але може не повністю усунути заїкання.

Щоб повністю позбутися цього, потрібно надати вашій грі повні права, щоб вона стала "критичною за часом", що не рекомендується. У деяких іграх це може статися, але рекомендується навчитися жити з цією проблемою, оскільки це поширене явище для ігор Windows, і більшість користувачів не грають у вікно (ігри, в які грають у вікні, наприклад, головоломки, зазвичай не мають цієї проблеми).

У повноекранному режимі Windows надає особливий пріоритет грі, тому заїкання більше не помітні та трапляються дуже рідко. Так грають у більшість ігор.

Використовуючи мишу з частотою опитування 1000 Гц або більше, розгляньте можливість використання повністю оновленої інсталяції Windows 11, яка містить виправлення, пов’язані з високим завантаженням процесора мишами з високою частотою опитування. Ці виправлення недоступні в Windows 10 і старіших версіях.

Порада

Ігри мають використовувати віконний режим Ексклюзивний повноекранний режим, на відміну від Повноекранного режиму, який призначений для того, щоб запобігти автоматичній обробці вікна Windows так, ніби воно було ексклюзивним повноекранним.

Повноекранний режим призначений для використання програмами з графічним інтерфейсом користувача, які хочуть використовувати попіксельну прозорість без ризику, що її вимкне ОС. Він досягає цього, залишаючи лінію в 1 піксель внизу екрана. Навпаки, Ексклюзивний повний екран використовує фактичний розмір екрана та дозволяє Windows зменшити тремтіння та затримку введення для повноекранних ігор.

Linux

Заїкання можуть бути помітні на настільному комп’ютері Linux, але це зазвичай пов’язано з іншими відеодрайверами та композиторами. Деякі композитори також можуть викликати цю проблему (наприклад, KWin), тому радимо спробувати використати інший, щоб виключити його як причину. Деякі менеджери вікон, такі як KWin і Xfwm, дозволяють вручну вимкнути композицію, що може покращити продуктивність (ціною розриву).

Немає обхідного шляху для заїкання драйвера або композитора, крім повідомлення про це як проблему розробникам драйвера або композитора. Заїкання може бути більш присутнім під час відтворення у віконному режимі, а не в повноекранному режимі, навіть якщо композицію вимкнено.

Feral GameMode можна використовувати для автоматичного застосування оптимізацій (наприклад, примусового налаштування профілю продуктивності GPU) під час виконання певних процесів.

macOS

Загалом macOS не затримується, хоча нещодавно повідомлялося про деякі помилки під час роботи в повноекранному режимі (це помилка macOS). Якщо у вас є машина, яка демонструє таку поведінку, повідомте нас.

Android

Як правило, Android не зависає та не тремтить, тому що бігова діяльність отримує весь пріоритет. Тим не менш, можуть бути проблемні пристрої (відомо, що старіший Kindle Fire є таким). Якщо ви бачите цю проблему на Android, повідомте нас.

iOS

Пристрої iOS зазвичай не зависають, але на старіших пристроях із новішими версіями операційної системи можуть виникати проблеми. Як правило, цього не уникнути.

Затримка введення

Конфігурація проекту

На платформах, які підтримують вимкнення V-Sync, затримку введення можна зробити менш помітною, вимкнувши V-Sync у налаштуваннях проекту. Однак це призведе до появи розривів, особливо на моніторах із низькою частотою оновлення. Пропонується зробити V-Sync доступним як опцію для перемикання гравців.

Під час використання методів візуалізації Forward+ або Mobile ще одним способом зменшити візуальну затримку, коли ввімкнено V-Sync, є використання V-Sync із подвійною буферизацією замість стандартної V-Sync із потрійною буферизацією. Починаючи з Godot 4.3, цього можна досягти, зменшивши параметр проекту Display > Window > V-Sync > Swapchain Image Count до 2. Недоліком використання подвійної буферизації є те, що частота кадрів буде менш стабільною, якщо частоту оновлення дисплея неможливо досягти через вузьке місце ЦП або ГП. Наприклад, на дисплеї з частотою 60 Гц, якщо частота кадрів зазвичай падає до 55 кадрів/с під час гри з потрійною буферизацією, її доведеться миттєво знизити до 30 кадрів/с із подвійною буферизацією (а потім повернутися до 60 кадрів/с, якщо це можливо). Як наслідок, V-Sync із подвійною буферизацією рекомендується, лише якщо ви можете постійно досягти частоти оновлення дисплея на цільовому обладнанні.

Збільшення кількості ітерацій фізики за секунду також може зменшити затримку введення, спричинену фізикою. Це особливо помітно при використанні фізичної інтерполяції (яка покращує плавність, але збільшує затримку). Для цього встановіть Physics > Common > Physics Ticks Per Second значення, що перевищує стандартне 60, або встановіть Engine.physics_ticks_per_second під час виконання в сценарії. Значення, кратні частоті оновлення монітора (зазвичай 60), найкраще працюють, коли фізичну інтерполяцію вимкнено, оскільки вони дозволяють уникнути тремтіння. Це означає, що такі значення, як 120, 180 і 240, є хорошими відправними точками. Як бонус, вищі фізичні FPS зменшують ймовірність виникнення проблем з тунелюванням і фізичною нестабільністю.

Недоліком збільшення FPS у фізичному режимі є те, що використання процесора збільшиться, що може призвести до вузьких місць у продуктивності в іграх із важким кодом симуляції фізики. Це можна пом’якшити, збільшивши фізичний FPS лише в ситуаціях, коли низька затримка критична, або дозволивши гравцям налаштувати фізичний FPS відповідно до свого обладнання. Однак різний фізичний FPS призведе до різних результатів фізичного моделювання, навіть якщо дельта постійно використовується у вашій логіці гри. Це може дати певним гравцям перевагу над іншими. Таким чином, у змагальних багатокористувацьких іграх слід уникати дозволу гравцеві самостійно змінювати фізику FPS.

Нарешті, ви можете вимкнути буферизацію вхідних даних для кожного відтвореного кадру, викликавши Input.set_use_accumulated_input(false) у сценарії. Це зробить так, що функції _input() і _unhandled_input() у ваших сценаріях викликатимуться при кожному введенні, а не накопичуватимуть вхідні дані та чекатимуть на відтворення кадру. Вимкнення накопичення вхідних даних збільшить використання ЦП, тому це слід робити з обережністю.

Порада

У будь-якому проекті Godot ви можете використовувати --disable-vsync command line argument для примусового вимкнення V-Sync. Починаючи з Godot 4.2, --max-fps <fps> також можна використовувати для встановлення обмеження FPS (0 означає необмежений). Ці аргументи можна використовувати одночасно.

Залежно від обладнання/ОС

Якщо ваш монітор підтримує це, увімкніть змінну частоту оновлення (G-Sync/FreeSync), залишивши V-Sync увімкненим, а потім обмежте частоту кадрів у налаштуваннях проекту до трохи нижче значення, ніж максимальна частота оновлення вашого монітора, як зазначено на цій сторінці. Наприклад, на моніторі з частотою 144 Гц ви можете встановити обмеження частоти кадрів проекту на 141. Спочатку це може здатися нерозумним, але обмеження FPS нижче максимальний діапазон частоти оновлення гарантує, що ОС ніколи не чекатиме завершення вертикального гасіння. Це призводить до подібної затримки введення, як і вимкнена V-Sync з тим самим обмеженням частоти кадрів (зазвичай менше ніж на 1 мс більше), але без розриву.

Це можна зробити, змінивши налаштування проекту Application > Run > Max FPS або призначивши Engine.max_fps під час виконання в сценарії.

На деяких платформах ви також можете ввімкнути режим низької затримки в параметрах графічного драйвера (наприклад, на панелі керування NVIDIA у Windows). Налаштування Ultra забезпечить вам найменшу можливу затримку за рахунок трохи нижчої середньої частоти кадрів. Змушення графічного процесора використовувати профіль максимальної продуктивності також може додатково зменшити затримку введення за рахунок більшого енергоспоживання (і, як наслідок, тепла/шуму вентилятора).

Насамкінець переконайтеся, що ваш монітор працює з максимально можливою частотою оновлення в налаштуваннях дисплея ОС.

Також переконайтеся, що ваша миша налаштована на використання найвищої частоти опитування (зазвичай 1000 Гц для ігрових мишей, іноді більше). Проте високі частоти опитування USB можуть призвести до високого використання ЦП, тому 500 Гц може бути безпечнішим для процесорів низького класу. Якщо ваша миша пропонує кілька налаштувань DPI, подумайте також про те, щоб використати найвище можливе налаштування та зменшити чутливість у грі, щоб зменшити затримку миші.

У Linux під час використання X11 вимкнення композитингу у віконних менеджерах, які його дозволяють (таких як KWin або Xfwm), може значно зменшити затримку введення.

Повідомлення про тремтіння, заїкання або проблеми із затримкою введення

Якщо ви повідомляєте про проблему заїкання або тремтіння (відкриття проблеми), спричинену не жодною з наведених вище причин, дуже чітко вкажіть всю можливу інформацію про пристрій, операційну систему, версії драйверів тощо. Це може допомогти краще усунути проблему.

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

Також переконайтеся, що використовуєте правильний термін (тремтіння, заїкання, затримка введення) на основі показаної поведінки. Це допоможе набагато швидше зрозуміти вашу проблему. Надайте проект, який можна використати для відтворення проблеми, і, якщо можливо, додайте знімок екрана, який демонструє помилку.