[英]Need to use floats for performance yet want double-precision calculations
MonoGame是微軟XNA的開源版本。 它是構建跨平台游戲的框架。
它有許多數學類型,如Vector和Quaternion。
我對他們使用雙打和花車的方式感到有點困惑。
到目前為止,我收集了以下信息:
這是一種困惑我的方法:
/// <summary>
/// Transforms a single Vector2, or the vector normal (x, y, 0, 0), by a specified Quaternion rotation.
/// </summary>
/// <param name="value">The vector to rotate.</param><param name="rotation">The Quaternion rotation to apply.</param>
public static Vector2 Transform(Vector2 value, Quaternion rotation)
{
float num1 = rotation.X + rotation.X;
float num2 = rotation.Y + rotation.Y;
float num3 = rotation.Z + rotation.Z;
float num4 = rotation.W * num3;
float num5 = rotation.X * num1;
float num6 = rotation.X * num2;
float num7 = rotation.Y * num2;
float num8 = rotation.Z * num3;
float num9 = (float) ((double) value.X * (1.0 - (double) num7 - (double) num8) + (double) value.Y * ((double) num6 - (double) num4));
float num10 = (float) ((double) value.X * ((double) num6 + (double) num4) + (double) value.Y * (1.0 - (double) num5 - (double) num8));
Vector2 vector2;
vector2.X = num9;
vector2.Y = num10;
return vector2;
}
為什么不使用任何一個浮點數(例如內聯num1..num8作為num9和num10的雙重表達式)?
這里的關鍵點是一系列計算都是以double
形式完成的,而不是將中間結果舍入為float
。 這可能導致最終float
結果更接近於無限精確算術產生的結果,給定float
輸入。
32位和64位浮點運算之間的性能差異很小。 存儲32位和存儲64位之間存在很大的空白差異。
將存儲每個值的字節數減半可能會對性能產生很大影響。 它有效地使每個高速緩存的大小加倍,以及每個數據傳輸路徑的帶寬。
花車可能比雙打效率更高
過去這是真的。 你必須回到幾十年前,大約是圖形算法最初設計的時間,並且必須在不太擅長加速浮點數學運算的硬件上運行。 或者因為它根本沒有任何東西而且它必須在軟件中進行仿真,從而使單精度自動更快。 或者因為它運行在專門構建的圖形終端上,那種具有自定義圖形處理器的類型無法比單精度浮動更好地處理任何東西。 在第一台Pentium之前,FPU並沒有得到保證,為程序員增加了幾年的時間來依靠16年前只有一台機器運行的軟件。
當然,所有已知的圖形算法都設計為使用單精度。 讓他們重寫以使用雙精度需要大量的勇氣 。 因為這將不可避免地引入錯誤,這樣的算法將不表現方式與單精度一個相同。 浮點數學不是精確的數學。 只是結果不同的事實足以產生錯誤報告,單精度版本將被視為規范標准,因為這是每個人一直在使用的。 除了推薦“不要使用它”之外,程序員完全沒有辦法讓用戶滿意。
所以圖形代碼不使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.