ไลบรารีพีชคณิตเชิงเส้นใหม่เข้าสู่ระบบนิเวศ Rust ที่แออัด: เปรียบเทียบกันอย่างไร?

BigGo Editorial Team
ไลบรารีพีชคณิตเชิงเส้นใหม่เข้าสู่ระบบนิเวศ Rust ที่แออัด: เปรียบเทียบกันอย่างไร?

ในโลกของกราฟิก 3 มิติ การจำลองทางฟิสิกส์ และการคำนวณทางวิทยาศาสตร์ การมีไลบรารีพีชคณิตเชิงเส้นที่มีประสิทธิภาพเป็นสิ่งสำคัญ ไลบรารี Rust ตัวใหม่ชื่อ lin-alg ได้ปรากฏตัวขึ้น นำเสนอการดำเนินการเกี่ยวกับเวกเตอร์ ควอเทอร์เนียน และเมทริกซ์สำหรับการใช้งานต่างๆ รวมถึงคอมพิวเตอร์กราฟิก หุ่นยนต์ และการสร้างแบบจำลองทางวิทยาศาสตร์ อย่างไรก็ตาม ระบบนิเวศของ Rust มีตัวเลือกที่มั่นคงหลายตัวในพื้นที่นี้อยู่แล้ว ทำให้ชุมชนเกิดคำถามว่าไลบรารีใหม่นี้เหมาะสมกับที่ใด

ระบบนิเวศที่แออัดด้วยผู้เล่นที่มั่นคง

ระบบนิเวศการพัฒนาเกมใน Rust ดูเหมือนจะแบ่งออกเป็นสองไลบรารีพีชคณิตเชิงเส้นหลัก: nalgebra (ที่ใช้กันทั่วไปกับเอนจิ้นฟิสิกส์ Rapier) และ glam นอกจากนี้ยังมี bevy_math ซึ่งผู้แสดงความคิดเห็นหลายคนสังเกตว่าจริงๆ แล้วเป็นการส่งออกฟังก์ชันการทำงานของ glam อีกทีหนึ่ง และไลบรารี cgmath ที่เก่ากว่าซึ่งไม่ได้รับการอัปเดตตั้งแต่เดือนมกราคม 2021 การแบ่งแยกนี้สร้างความท้าทายให้กับนักพัฒนาที่พยายามเลือกเครื่องมือที่เหมาะสมสำหรับโปรเจกต์ของพวกเขา โดยเฉพาะเมื่อไลบรารีมีปรัชญาการออกแบบและกลยุทธ์การเพิ่มประสิทธิภาพที่แตกต่างกัน

ระบบนิเวศการพัฒนาเกมดูเหมือนจะแบ่งแยกระหว่าง nalgebra (สำหรับผู้ใช้ Rapier) และ glam lin-alg เหมาะสมกับที่ไหน?

ความแตกต่างในการปฏิบัติและข้อพิจารณาด้านประสิทธิภาพ

หนึ่งในประเด็นสำคัญในการสนทนาของชุมชนเกี่ยวข้องกับวิธีที่ไลบรารีเหล่านี้ใช้ในการปฏิบัติประเภทเวกเตอร์ภายใน ซึ่งส่งผลกระทบโดยตรงต่อประสิทธิภาพ ตามการวิเคราะห์ของชุมชน nalgebra ใช้อาร์เรย์ขนาดคงที่ (Vec4 มีโครงสร้างเป็น [[f32; 4]; 1]) ในขณะที่ lin-alg ดูเหมือนจะใช้ฟิลด์แต่ละตัว (โครงสร้างที่มีฟิลด์ x, y, z, w) และ glam ใช้ประโยชน์จากประเภท SIMD (__m128) สำหรับการดำเนินการบางอย่าง ความแตกต่างในการปฏิบัตินี้มีความสำคัญอย่างมากสำหรับแอปพลิเคชันที่ต้องการประสิทธิภาพสูง

ผู้แสดงความคิดเห็นหลายคนชี้ไปที่ mathbench-rs ซึ่งเป็นโปรเจกต์เปรียบเทียบประสิทธิภาพที่เปรียบเทียบไลบรารีคณิตศาสตร์ต่างๆ การสนทนาเผยให้เห็นว่าสำหรับประสิทธิภาพ SIMD (Single Instruction, Multiple Data) ที่เหมาะสม นักพัฒนาหลายคนชอบวิธีการที่แตกต่างจากที่ glam ใช้ - การจัดโครงสร้างเวกเตอร์เพื่อประมวลผลปัญหาหลายอย่างพร้อมกันแทนที่จะใช้ SIMD สำหรับการดำเนินการเวกเตอร์เดียว

ไลบรารีพีชคณิตเชิงเส้นในระบบนิเวศ Rust

  • nalgebra: ใช้อาร์เรย์ขนาดคงที่ เป็นที่นิยมในเอนจิน Rapier physics
  • glam: ใช้ประเภท SIMD สำหรับการดำเนินการบางอย่าง ใช้กันอย่างแพร่หลายในการพัฒนาเกม
  • bevy_math: ส่งออกฟังก์ชันการทำงานของ glam อีกครั้ง
  • cgmath: ไลบรารีเก่ากว่า ไม่มีการอัปเดตตั้งแต่มกราคม 2021
  • 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 และ Feature Flags

หนึ่งในแง่มุมที่อาจเป็นนวัตกรรมของ lin-alg คือการสนับสนุน no_std สำหรับระบบฝังตัว อย่างไรก็ตาม ผู้แสดงความคิดเห็นคนหนึ่งชี้ให้เห็นว่าวิธีการของไลบรารีที่มีต่อ feature flags ไม่ได้ทำตามแนวปฏิบัติที่แนะนำของ Rust ไลบรารีใช้ฟีเจอร์ no_std เพื่อปิดการใช้งานฟังก์ชันไลบรารีมาตรฐาน ในขณะที่ชุมชน Rust โดยทั่วไปแนะนำให้มีฟีเจอร์ std ที่เปิดใช้งานฟีเจอร์ไลบรารีมาตรฐานตามเงื่อนไข วิธีการนี้ทำให้มั่นใจได้ว่า feature flags ยังคงเพิ่มเติมได้ ตามหลักการออกแบบของ Rust

แรงจูงใจของนักพัฒนา

แม้ว่าจะไม่มีการให้ข้อมูลเปรียบเทียบประสิทธิภาพ การคาดเดาของชุมชนเกี่ยวกับแรงจูงใจของผู้เขียนได้รับการยืนยันโดยผู้สร้างไลบรารี แทนที่จะมุ่งเน้นที่ข้อได้เปรียบด้านประสิทธิภาพ ไลบรารีดูเหมือนจะถูกสร้างขึ้นเนื่องจากความคับข้องใจกับการดำเนินการควอเทอร์เนียนที่ไม่สอดคล้องกันในไลบรารีที่มีอยู่ ผู้เขียนกล่าวว่าพวกเขาใช้มันเป็นวิธีที่มีแรงเสียดทานต่ำในการรักษาฟังก์ชันทางเรขาคณิตระหว่างโปรเจกต์หลายโปรเจกต์ โดยพบว่าการแก้ไขโค้ดเบสของตัวเองง่ายกว่าการผ่านกระบวนการ pull request กับไลบรารีอื่น

สำหรับนักพัฒนาที่กำลังพิจารณาว่าจะใช้ไลบรารีพีชคณิตเชิงเส้นใดในโปรเจกต์ Rust ของพวกเขา ทางเลือกยังคงซับซ้อน ในขณะที่ตัวเลือกที่มั่นคงอย่าง nalgebra และ glam มีฐานผู้ใช้ที่ใหญ่กว่าและอาจมีการทดสอบที่ละเอียดมากกว่า lin-alg นำเสนอทางเลือกที่อาจเหมาะสมกับกรณีการใช้งานเฉพาะดีกว่า โดยเฉพาะอย่างยิ่งในกรณีที่ความสอดคล้องของการดำเนินการควอเทอร์เนียนเป็นสิ่งสำคัญหรือในกรณีที่จำเป็นต้องมีการสนับสนุน no_std

อ้างอิง: Vectors, quaternions, and matrices for general purposes, and computer graphics.