Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

下一個座標

備註

大世界座標主要用於 3D 專案;2D 專案很少會用到。此外,啟用大世界座標後,2D 渲染目前無法從精度的增加中獲益,但 3D 渲染可以。

為什麼要使用大世界座標?

在 Godot 中,物理模擬和渲染都依賴於*浮點數*。然而,電腦中浮點數的**精度和範圍是有限的**,可能在太空、星球尺度的模擬遊戲等擁有龐大世界的遊戲中產生問題。

浮點數的精度在 0.0 附近是最高的。隨著取值離 0.0 越來越遠,精度就會變得越來越低。每次浮點數的*指數*變大時,精度就會降低,也就是浮點數取值越過 2 的冪(2、4、8、16……)的時候。此時浮點數的最小步長就會*增大*,精度因此變低。

在實踐中,這意味著玩家遠離世界原點(2D 遊戲的 Vector2(0, 0) 和 3D 遊戲的 Vector3(0, 0, 0)),精度就會下降。

精度的丟失可能會導致遠離世界原點的物件看上去在“抖動”,因為模型的位置會吸附到最接近的浮點數能夠表示的值。這種情況下,如果玩家遠離世界原點,還可能導致物理方面的問題。

範圍決定的是所能夠儲存的最小和最大值。如果玩家嘗試移出這個範圍就會直接失敗。但是實際情況下,在能夠受到範圍影響之前幾乎都會遇到浮點數精度問題。

範圍和精度(兩個指數間隔的最小步長)取決於浮點數的型別。單精確度浮點數的*理論*範圍支援儲存極高的值,單精確度很低。實踐中,無法表示所有整數值的浮點數型別並不是很有用。極值附近的精度會變得非常低,低到連兩個*整數*值也無法區分。

以下是浮點數能夠表示整數值的範圍:

  • 單精確度浮點數範圍(表示所有整數):-16,777,216 和 16,777,216 之間

  • 雙精度浮點數範圍(表示所有整數):-9 千萬億和 9 千萬億之間

範圍

單引號

雙引號

Comment 註解

[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 一文。

大世界座標的工作原理

大世界座標(也叫**雙精度物理**)能夠增加引擎中所有浮點數計算的精度級別。

預設情況下,GDScript 中的 class_float 是 64 位,但 class_Vector2、class_Vector3 和 class_Vector4 是 32 位元。這意味著向量型別的精度受到更多限制。為了解決這個問題,我們可以增加 Vector 型別中用來表示浮點數的位數。這會導致精度呈「指數級」增長,這意味著最終值的精度不僅是兩倍,而且在高值時可能精確數千倍。從單精度浮點變成雙精度浮點,可以表示的最大值也大大增加。

為了避免遠離世界原點時出現模型捕捉問題,Godot 的 3D 渲染引擎將在啟用大世界座標時提高渲染操作的精確度。出於性能原因,著色器不使用雙精度浮點數,但使用替代解決方案<https://github.com/godotengine/godot/pull/66178>`__ 來模擬雙精度,以便使用單精度浮點數進行渲染。

備註

啟用大世界座標會帶來效能和記憶體使用損失,尤其是在 32 位元 CPU 上。僅當您確實需要時才啟用大世界座標。

此功能專為中階/高階桌面平台量身打造。大世界座標在低階行動裝置上可能表現不佳,除非您採取措施透過其他方式減少 CPU 使用率(例如減少每秒物理滴答數)。

在低端平台上,可以使用“原點轉移”方法來允許大世界,而無需使用雙精度物理和渲染。原點轉移適用於單精度浮點數,但它為遊戲邏輯帶來了更多的複雜性,尤其是在多人遊戲中。因此,本頁不詳細介紹原點移位。

大世界座標的目標群體是誰?

3D 空間或行星尺度模擬遊戲通常需要大世界座標。這擴充到需要支援*非常*快的移動速度,但有時也需要非常慢*和*精確移動的遊戲。

另一方面,僅在實際需要時才使用大世界座標(出於性能原因),這一點很重要。大世界座標通常**不需要**:

  • 2D 遊戲,因為精度問題通常不太明顯。

  • 具有小規模或中規模世界的遊戲。

  • 具有廣闊世界的遊戲,但分為不同的級別,其間有加載順序。您可以將每個關卡部分以世界原點為中心,以避免精確度問題,而不會影響效能。

  • 開放世界遊戲,*可步行區域*不超過 8192×8192 公尺(以世界原點為中心)。如上表所示,即使對於第一人稱遊戲,精度等級在該範圍內仍然可以接受。

如果有疑問,您可能不需要在專案中使用大世界座標。作為參考,大多數現代 AAA 開放世界遊戲不使用大型世界坐標系,並且仍然依賴單精度浮點進行渲染和物理。

啟用大世界座標

此過程需要重新編譯編輯器和您打算使用的所有匯出模板二進位。如果您只想以發布模式匯出專案,則可以跳過偵錯匯出範本的編譯。無論如何,您都需要編譯編輯器版本,以便可以測試大型精確世界,而不必每次都匯出專案。

請參閱 編譯 部分,以了解每個目標平台的編譯指令。編譯編輯器和匯出模板時,您需要新增“ precision=double ” SCons 選項。

產生的二進位檔案將以“.double”後綴命名,以將其與單精確度二進位(缺少任何精確度後綴)區分開來。然後,您可以在「匯出」對話方塊的專案匯出預設中將二進位檔案指定為自訂匯出範本。

單雙精度建構之間的的相容性

使用 class_ResourceSaver 單例儲存*二進位*資源時,如果使用使用雙精確度數字的建置儲存資源,則會在檔案中儲存一個特殊旗標。因此,當您切換到雙精度建置並保存它們時,磁碟上的所有二進位資源都會發生變化。

單精度和雙精度建置都支援在使用此特殊旗標的資源上使用 class_ResourceLoader 單例。這意味著單精度建置可以載入使用雙精度建置節省的資源,反之亦然。基於文字的資源不儲存雙精度旗標,因為它們不需要這樣的旗標來正確讀取。

已知的不相容

  • 在網路多人遊戲中,伺服器和所有使用者端應使用相同的建置型別,以確保客戶端之間的精確度保持一致。使用不同的建置型別*可能*有效,但可能會出現各種問題。

  • GDExtension API 在雙精確度建置中以不相容的方式變更。這意味著擴充 必須 重新建構才能使用雙精度建構。在擴充開發人員端,當使用「 precision=double 」建置 GDExtension 時,會啟用「 REAL_T_IS_DOUBLE 」定義。 real_t 可以用作單精度建置中的 float 的別名,以及雙精度建置中的 double 的別名。

限制

由於 3D 渲染著色器實際上並未使用雙精確度浮點,因此在 3D 渲染精度方面存在一些限制:

  • 使用“skip_vertex_transform”或“world_vertex_coords”的著色器不會從提高的精度中受益。

  • 三平面貼圖 不會從提高的精確度中受益。當遠離世界原點時,使用三平面貼圖的材質將表現出可見的抖動。

當啟用大世界座標時,2D 渲染目前無法從精確度的提升中受益。這可能會導致在遠離世界原點(從典型縮放等級的數百萬像素開始)時發生可見模型捕捉。不過,二維物理計算仍將受益於精確度的提升。