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

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

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

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

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

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

../../_images/motion_normal.gif

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

../../_images/motion_jitter.gif

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

../../_images/motion_stutter.gif

джиттер

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

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

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

Заїкатися

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

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

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

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

Windows

Windows, як відомо, викликає заїкання у віконних іграх. Це здебільшого залежить від встановленого апаратного забезпечення, версії драйверів і процесів, що виконуються паралельно (наприклад, багато відкритих вкладок у веб-переглядачі може призвести до зависань у запущеній грі). Щоб уникнути цього, починаючи з 3.1, 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 вимкнення композиції у віконних менеджерах, які її дозволяють (наприклад, KWin або Xfwm), може значно зменшити затримку введення.

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

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

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

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