新的線性代數庫進入擁擠的 Rust 生態系統:它如何比較?

BigGo Editorial Team
新的線性代數庫進入擁擠的 Rust 生態系統:它如何比較?

在 3D 圖形、物理模擬和科學計算的世界中,擁有高效的線性代數庫至關重要。一個名為 lin-alg 的新 Rust 庫已經出現,為包括計算機圖形學、機器人技術和科學建模在內的各種應用提供向量、四元數和矩陣操作。然而,Rust 生態系統中已經有幾個成熟的選擇,這使得社群開始質疑這個新庫適合在哪裡使用。

擁擠的生態系統與成熟的參與者

Rust 的遊戲開發生態系統主要被兩個主要的線性代數庫所分割:nalgebra(通常與 Rapier 物理引擎一起使用)和 glam。還有 bevy_math,許多評論者指出它實際上是重新匯出了 glam 的功能,以及更老的 cgmath 庫,該庫自 2021 年 1 月以來就沒有更新過。這種分散化為開發者選擇適合其專案的正確工具帶來了挑戰,特別是當不同庫具有不同的設計理念和最佳化策略時。

「遊戲開發生態系統似乎在 nalgebra(用於 Rapier 使用者)和 glam 之間分裂。lin-alg 適合在哪裡?」

實現差異和效能考量

社群討論的一個關鍵點圍繞著這些庫如何在內部實現向量型別,這直接影響效能。根據社群分析,nalgebra 使用固定大小的陣列(Vec4 的結構為 [[f32; 4]; 1]),而 lin-alg 似乎使用單獨的欄位(具有 x、y、z、w 欄位的結構體),glam 則利用 SIMD 型別(__m128)進行某些操作。這些實現差異對效能關鍵型應用程式非常重要。

幾位評論者指向了 mathbench-rs,這是一個比較各種數學庫的基準測試專案。討論揭示,為了獲得最佳的 SIMD(單指令多資料)效能,許多開發者更喜歡與 glam 不同的方法——構建向量以同時處理多個問題,而不是將 SIMD 用於單個向量操作。

Rust 生態系統中的線性代數庫

  • nalgebra:使用固定大小的陣列,與 Rapier 物理引擎配合使用廣泛
  • glam:對某些操作使用 SIMD 型別,在遊戲開發中廣泛使用
  • bevy_math:重新匯出 glam 功能
  • cgmath:較舊的庫,自2021年1月以來未更新
  • lin-alg:新庫,使用獨立欄位實現,支援 no_std

實現差異

向量實現 備註
nalgebra 固定大小的陣列 ([[f32; 4]; 1])
lin-alg 獨立欄位(包含 x,y,z,w 的結構體)
glam 某些型別使用 SIMD 型別 (__m128)

lin-alg 的主要特點

  • 向量、矩陣和四元數操作
  • 基於 f32 或 f64 的型別
  • 支援嵌入式系統的 no_std
  • 透過特性標誌提供計算機圖形功能
  • 透過特性標誌支援 Bincode 二進位制編碼/解碼

No_std 支援和功能標誌

lin-alg 的一個潛在新穎方面是它對嵌入式系統的 no_std 支援。然而,一位評論者指出,該庫對功能標誌的處理方式不符合 Rust 的推薦做法。該庫使用 no_std 功能來停用標準庫功能,而 Rust 社群通常建議使用 std 功能來有條件地啟用標準庫功能。這種方法確保功能標誌保持增量性,遵循 Rust 的設計原則。

開發者動機

雖然沒有提供基準測試,但社群對作者動機的猜測得到了庫建立者的確認。該庫的建立似乎不是專注於效能優勢,而是由於對現有庫中四元數操作不一致的挫折感。作者提到,他們將其用作在多個專案之間儲存幾何函式的低摩擦方式,發現修改自己的程式碼庫比透過其他庫的拉取請求流程更容易。

對於考慮在 Rust 專案中使用哪個線性代數庫的開發者來說,選擇仍然複雜。雖然 nalgebra 和 glam 等成熟選項擁有更大的使用者群和可能更全面的測試,但 lin-alg 提供了一種可能更適合特定用例的替代方案,特別是在四元數操作一致性是優先事項或需要 no_std 支援的情況下。

參考:用於一般目的和計算機圖形學的向量、四元數和矩陣。