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.

Великі світові координати

Примітка

Великі світові координати в основному корисні в 3D-проектах; вони рідко потрібні в 2D-проектах. Крім того, на відміну від 3D-візуалізації, 2D-рендеринг наразі не отримує переваг від підвищення точності, коли ввімкнено великі світові координати.

Навіщо використовувати великі світові координати?

У Godot фізичне моделювання та візуалізація покладаються на числа з плаваючою комою. Однак в обчисленнях числа з плаваючою комою мають обмежену точність і діапазон. Це може бути проблемою для ігор із величезними світами, як-от ігор-симуляторів космосу чи планети.

Точність є найбільшою, коли значення наближається до 0.0. Точність поступово знижується, коли значення збільшується або зменшується від 0.0. Це відбувається кожного разу, коли експонента числа з плаваючою комою збільшується, що відбувається, коли число з плаваючою комою перевищує значення степеня 2 (2, 4, 8, 16, …). Кожного разу, коли це відбувається, мінімальний крок числа збільшуватиметься, що призведе до втрати точності.

На практиці це означає, що коли гравець віддаляється від початку світу (Vector2(0, 0) у 2D іграх або Vector3(0, 0, 0) у 3D іграх), точність буде зменшуватися.

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

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

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

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

  • Діапазон одинарної точності з плаваючою точкою (представляє всі цілі числа): Від -16 777 216 до 16 777 216

  • Діапазон з плаваючою точкою подвійної точності (представляє всі цілі числа): Від -9 квадрильйонів до 9 квадрильйонів

Діапазон

Один крок

Подвійний крок

Коментар

[1; 2]

~0.0000001

~1e-15

Точність стає більшою біля 0,0 (ця таблиця скорочена).

[2; 4]

~0.0000002

~1e-15

[4; 8]

~0.0000005

~1e-15

[8; 16]

~0.000001

~1e-14

[16; 32]

~0.000002

~1e-14

[32; 64]

~0.000004

~1e-14

[64; 128]

~0.000008

~1e-13

[128; 256]

~0.000015

~1e-13

[256; 512]

~0.00003

~1e-13

[512; 1024]

~0.00006

~1e-12

[1024; 2048]

~0.0001

~1e-12

[2048; 4096]

~0.0002

~1e-12

Максимальний рекомендований діапазон одинарної точності для 3D-гри від першої особи без артефактів або фізичних збоїв.

[4096; 8192]

~0.0005

~1e-12

Максимальний рекомендований діапазон одинарної точності для 3D-ігор від третьої особи без артефактів або фізичних збоїв.

[8192; 16384]

~0.001

~1e-12

[16384; 32768]

~0.0019

~1e-11

Максимальний рекомендований діапазон із одинарною точністю для 3D-ігор, що відтворюються зверху вниз, без артефактів або фізичних збоїв.

[32768; 65536]

~0.0039

~1e-11

Максимальний рекомендований діапазон одинарної точності для будь-якої 3D-ігри. Після цієї точки зазвичай потрібна подвійна точність (великі світові координати).

[65536; 131072]

~0.0078

~1e-11

[131072; 262144]

~0.0156

~1e-10

> 262144

> ~0.0313

~1e-10 (0.0000000001)

Понад це значення подвійна точність залишається набагато точнішою, ніж одинарна.

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

Дивись також

Перегляньте статтю Demystifying Floating Point Precision для отримання додаткової інформації.

Як працюють великі світові координати

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

За замовчуванням float є 64-бітним у GDScript, але class_Vector2, class_Vector3 і class_Vector4 є 32-розрядними. Це означає, що точність векторних типів набагато обмеженіша. Щоб вирішити цю проблему, ми можемо збільшити кількість бітів, які використовуються для представлення числа з плаваючою комою у векторному типі. Це призводить до експоненціального збільшення точності, що означає, що кінцеве значення не просто вдвічі точніше, але й потенційно в тисячі разів точніше за високих значень. Максимальне значення, яке можна представити, також значно збільшується шляхом переходу від числа з плаваючою точністю одинарної точності до числа з плаваючою точністю подвійної точності.

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

Примітка

Увімкнення великих світових координат призводить до зниження продуктивності та використання пам’яті, особливо на 32-розрядних ЦП. Увімкніть великі світові координати, лише якщо вони вам дійсно потрібні.

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

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

Для кого великі світові координати?

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

З іншого боку, важливо використовувати великі світові координати лише тоді, коли це дійсно необхідно (з причин продуктивності). Великі світові координати зазвичай не потрібні для:

  • 2D-ігри, оскільки проблеми з точністю зазвичай менш помітні.

  • Ігри з маленькими або середніми світами.

  • Ігри з великими світами, але розділеними на різні рівні з послідовностями завантаження між ними. Ви можете центрувати кожну частину рівня навколо світового початку, щоб уникнути проблем із точністю без погіршення продуктивності.

  • Ігри з відкритим світом із ігровою зоною, що не перевищує 8192×8192 метри (з центром навколо світу). Як показано в таблиці вище, рівень точності залишається прийнятним у цьому діапазоні навіть для гри від першої особи.

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

Увімкнення великих світових координат

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

Перегляньте розділ Компіляція, щоб отримати інструкції зі збирання для кожної цільової платформи. Вам потрібно буде додати опцію precision=double SCons під час компіляції редактора та шаблонів експорту.

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

Сумісність збірок одинарної та подвійної точності

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

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

Відомі несумісності

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

  • API GDExtension змінюється несумісним чином у збірках подвійної точності. Це означає, що розширення треба перебудувати для роботи зі збірками подвійної точності. З боку розробника розширення визначення REAL_T_IS_DOUBLE увімкнено під час створення GDExtension з precision=double. real_t можна використовувати як псевдонім для float у збірках одинарної точності та double у збірках подвійної точності.

Обмеження

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

  • Триплощинне відображення не має переваг від підвищення точності. Матеріали, які використовують триплощинне відображення, демонструватимуть видиме тремтіння, коли знаходяться далеко від джерела світу.

  • Вузли GPUParticles3D з вимкненими Локальними координатами не матимуть підвищеної точності. Це може призвести до видимого прив'язування частинок, коли вони знаходяться далеко від початку координат. Вузли з увімкненими Локальними координатами, а також вузли CPUParticles3D, все одно матимуть підвищену точність.

  • Шейдери, що використовують режими рендерингу skip_vertex_transform або world_vertex_coords, не отримують переваг від підвищеної точності.

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

    vec3 world = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
    

    Натомість обчисліть координати світового простору у функції vertex() і передайте їх за допомогою varying, наприклад:

    varying vec3 world;
    void vertex() {
        world = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
    }
    

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