Hypersomnia - เกมยิงมัลติเพลเยอร์โอเพนซอร์สและเทคโนโลยีที่ใช้ใน Assassin's Creed: Valhalla และโดรน Skydio
(github.com/TeamHypersomnia)- Hypersomnia เป็นเกมยิงมัลติเพลเยอร์ที่ขับเคลื่อนโดยชุมชน รองรับการดวลกับเพื่อนหรือการต่อสู้ระหว่างสองแคลน และเป็นเกมที่เล่นออนไลน์ได้มาตั้งแต่ปี 2017
- เขียนด้วย Modern C++ และพัฒนาโดย ไม่ใช้เกมเอนจิน ให้บริการเป็นเกมโอเพนซอร์สฟรี
- รูปแบบของเกมผสมผสานแท็กติกแบบ Counter-Strike, ความไดนามิกของ Hotline Miami และความคิดถึงงานพิกเซลอาร์ตของ RPG ยุคเก่า ปัจจุบันมีอาวุธปืนเฉพาะตัว 24 แบบ, แผนที่จากชุมชน 10 แผนที่ และโหมด 2 แบบคือ Bomb defusal กับ Gun game
- ช่องทางเผยแพร่มี เล่นผ่านเบราว์เซอร์, Steam, Windows, Linux AppImage และ macOS dmg โดยเมื่อเริ่มเกมจะเปิด interactive Tutorial
- การรันเซิร์ฟเวอร์ทำได้ด้วย Server Docker หรือ Headless AppImage และทุก archive มีการลงลายเซ็นดิจิทัล พร้อมมีช่องทางสำหรับตรวจสอบลายเซ็น
- ตัวแก้ไขแผนที่ ในตัวเป็นแบบ WYSIWYG 100% ที่ทำงานโดยตรงในโลกของเกม สร้างด้วย ImGui และใช้รูปแบบแผนที่เป็น JSON
- เมื่อวางโฟลเดอร์ PNG, WAV, OGG ลงในไดเรกทอรีแผนที่ เกมจะตรวจพบโดยอัตโนมัติ
- เมื่อลากและวาง GIF ลงในฉาก มันจะทำงานเป็นแอนิเมชันทันทีภายในเกม
- แผนที่ที่กำลังทำงานอยู่สามารถ playtest ได้ด้วยการคลิกครั้งเดียว และไคลเอนต์ที่เชื่อมต่อจะดาวน์โหลดแผนที่เวอร์ชันปัจจุบันกับทรัพยากรแบบกำหนดเองโดยอัตโนมัติ
- เซิร์ฟเวอร์ เกม และตัวแก้ไขอยู่ในไฟล์ปฏิบัติการเดียวกันบนทุก OS จึงสามารถเริ่มเซสชันจากตัวแก้ไข หยุดด้วย ESC แล้วกลับสู่สถานะเดิมได้
- ระบบเครือข่ายอิงกับ ความกำหนดแน่นอนของการจำลองข้ามแพลตฟอร์ม โดยทำงานแบบกำหนดแน่นอน 100% ทั้งบนไคลเอนต์เบราว์เซอร์, ไคลเอนต์เนทีฟ Windows, Linux, macOS ไปจนถึงเนทีฟ ARM build
- แทนที่จะส่งสถานะของทุกอ็อบเจกต์ผ่านเครือข่ายอย่างต่อเนื่อง จะส่งเฉพาะอินพุตของผู้เล่น และให้ไคลเอนต์แต่ละตัวจำลองส่วนที่เหลือในเครื่อง
- เพื่อให้การคำนวณ floating-point มีความกำหนดแน่นอน ใช้
clangบนทุก OS, ใช้/fp:strictกับ Windows build, ใช้-ffp-model=strictกับ ARM build และแทนที่ฟังก์ชันคณิตศาสตร์อย่างstd::sin,std::sqrtด้วย implementation ตระกูล STREFLOP - ในตัวอย่างที่มีตัวละครที่ผู้เล่นควบคุม 2 ตัว ที่ tickrate 60Hz ทราฟฟิกอยู่ราว
40 kbit/s (= 5 KB/s)และในทราฟฟิกเครือข่ายมีเพียงตัวละครที่ผู้เล่นควบคุมเท่านั้นที่มีส่วนสร้างทราฟฟิก
- ไคลเอนต์เบราว์เซอร์และไคลเอนต์เนทีฟสามารถเล่นร่วมกันบนเซิร์ฟเวอร์เดียวกันได้ด้วย libdatachannel และ datachannel-wasm
- สามารถโฮสต์เซิร์ฟเวอร์จากเบราว์เซอร์แล้วเชื่อมต่อด้วยไคลเอนต์เนทีฟได้ และยังสามารถเปิดเซิร์ฟเวอร์จากไคลเอนต์เนทีฟแล้วส่งลิงก์ให้เชื่อมต่อผ่านเบราว์เซอร์ได้ด้วย
- เวอร์ชันเบราว์เซอร์รองรับการล็อกอินด้วย Discord, แมตช์จัดอันดับ และ global Leaderboards หากเชื่อมบัญชี Discord กับบัญชี Steam เวอร์ชัน Steam และเว็บจะใช้ rating เดียวกัน
- rectpack2D ที่เขียนขึ้นสำหรับ texture packing ถูกใช้ใน Assassin's Creed: Valhalla, บริษัทผู้ผลิตโดรน และบทความวิทยาศาสตร์ 2 ฉบับ
- การ implement memory pool ให้พื้นที่จัดเก็บต่อเนื่อง, การจัดสรร O(1), การคืนหน่วยความจำ O(1), การ dereference O(1), การขยายอัตโนมัติ และพฤติกรรมแบบกำหนดแน่นอน โดยเมื่อส่งสถานะเริ่มต้นของโลก จะรวมถึงสถานะภายในของ pool อ็อบเจกต์เกมด้วย ทำให้ไคลเอนต์สามารถจำลองตัวระบุอ็อบเจกต์และลำดับหน่วยความจำเดียวกันได้อย่างกำหนดแน่นอน
- self-updater ในตัวจะดาวน์โหลดและใช้การอัปเดตโดยอัตโนมัติ ตรวจสอบว่าอัปเดตมาจาก public key ของนักพัฒนาที่ hardcode ไว้ด้วยการเรียก
ssh-keygenและหากโฮสติ้ง build ถูกแฮ็กจนมีการอัปโหลดเวอร์ชันอันตราย ไคลเอนต์เดิมจะปฏิเสธการใช้การอัปเดตนั้น
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เคยสงสัยว่าคณิตศาสตร์ floating-point ไม่ได้ถูกกำหนดสเปกไว้อย่างสมบูรณ์หรือไง แต่ควรค้นหาก่อนจริง ๆ: https://stackoverflow.com/questions/49471943/floating-point-...
มันไม่ได้จบด้วยคำสั่ง
sqrtตัวเดียว แต่เริ่มจากการประมาณแบบ Taylor แล้วค่อยรันวิธี Newton หลายรอบเพื่อขัดเกลาคำตอบ ทำให้มีตัวเลือกอย่างลำดับของอนุกรม Taylor จุดศูนย์กลาง และจำนวนรอบที่วนIEEE 754 อาจกำหนดการคูณได้ แต่สำหรับ
sqrt,sin,cos,tanต้องกำหนดวิธีคำนวณเอง ซึ่งโดยปกติ implementation นั้นจะอยู่ใน standard library ที่คอมไพเลอร์จัดมาให้แถม floating-point ยังไม่เป็นไปตามสมบัติการเปลี่ยนหมู่ เพราะ
(a+b)+c != a+(b+c)ดังนั้นแค่สลับลำดับของโอเปอเรชันพื้นฐาน ผลลัพธ์ก็อาจต่างกันได้วิธีการปัดเศษอาจต่างกันไปตามสถาปัตยกรรม และถ้าปน arm/amd/intel เข้าด้วยกันก็มีโอกาสเกิดพฤติกรรมไม่กำหนดได้: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
เกมนี้ดูเหมือนจะหลีกเลี่ยงปัญหานั้นด้วยการใช้ implementation floating-point แบบซอฟต์แวร์ และถ้าใช้คอมไพเลอร์แบบเดียวกันด้วยก็น่าจะหลุดพ้นจากปัญหาส่วนใหญ่ได้
https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
ใน C และภาษาอื่น ๆ อีกหลายภาษา โอเปอเรเตอร์ที่ใช้กันทั่วไปไม่ได้ถูกแมปอย่างชัดเจนไปยังโอเปอเรชัน floating-point เฉพาะตัว ทำให้คอมไพเลอร์มีดุลยพินิจสูงมาก
อีกทั้งยังมี สถานะ global ที่มองไม่เห็น อย่างโหมดการปัดเศษที่ถูกใช้อยู่บ้าง เท่าที่จำได้ DirectX เคยแอบเปลี่ยนแฟล็กพวกนี้อยู่เบื้องหลัง
-marchต่างกัน ผลลัพธ์ก็อาจต่างกันมากพอสมควรเพียงแต่ไม่ได้เป็นโอเพนซอร์ส และไม่ได้หมายความว่านี่ไม่ใช่ความสำเร็จ เพราะของแบบนี้ยากมากจริง ๆ
[0] https://springrts.com/
ความต่างในที่นี้คือเกม RTS ไม่ได้ใช้ ฟิสิกส์ floating-point แบบกำหนดได้ ดังนั้น Hypersomnia จึงต้องการแนวทางใหม่
มันเข้ามาเติมช่องว่างที่ TA กับ SupCom ทิ้งไว้ และแม้ SupCom 2 จะเป็น RTS ขนาดเล็กที่เล่นง่ายและค่อนข้างดีในแบบของมันเอง แต่มันก็ยังไม่ถึงขั้นนั้น
ส่วน PA ขอไม่พูดถึงดีกว่า
BAR ก็ดูมีอนาคตไม่น้อย: https://www.beyondallreason.info
ตัวเกมเองไม่ได้ถูกใช้ใน AC:Valhalla แต่เป็นไลบรารีสำหรับแพ็กเท็กซ์เจอร์ที่สร้างขึ้นระหว่างการพัฒนาต่างหากที่ถูกนำไปใช้[1] แน่นอนว่าไม่ได้จะลดค่าความสำเร็จนั้น เพราะแค่เรื่องนั้นอย่างเดียวก็เขียนเป็นบทความได้แล้ว
อีกอย่าง การบอกว่ามันเป็นต้นทางของระบบ ECS ที่ใช้ใน Unity ก็ดูออกจะพูดเกินไปนิดหน่อย ผมเคยใช้เกมเอนจินที่ใช้ ECS มาก่อนปี 2010 เสียอีก และฝั่งเกมเอนจินก็ดูเหมือนจะสืบทอดมาจาก Operation Flashpoint[2]
[1] https://github.com/TeamHypersomnia/rectpack2D
[2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
ถ้าวันไหนมีเวลา ซึ่งคงเป็นหลังเกษียณ ก็คงอยากลองทำอะไรแบบนี้ดู และโปรเจ็กต์ลักษณะนี้ก็น่าจะเป็นตำราที่ดีสำหรับเรียนรู้โลกนั้น
มันทำให้นึกถึง ARC ในช่วงปลายยุค 90 หรือ Attack Retrieve Capture ซึ่งตอนนี้ยังพอมีชีวิตอยู่แบบกระท่อนกระแท่นในชื่อ Armor Critical
https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
http://armorcritical.com
อยากรู้ว่าเพื่อพยุงโปรเจ็กต์นี้ไว้ เขาไปทำงานเชิงพาณิชย์อะไรมาอีกบ้าง มีแผนลง Steam ไหม และ persistent world ส่งผลต่อเกมเพลย์อย่างไร
แล้วเทคนิคอันชาญฉลาดในการสร้างสถานะฟิสิกส์กลับขึ้นมาใหม่ตอนผู้เล่นใหม่เข้ามา มันแสดงผลกับผู้เล่นเดิมอย่างไรด้วย เช่น ตำแหน่งกระสุนมีการขยับหรือไม่
อีกทั้งยังลงทุนเงินเก็บได้ดีพอ จึงโฟกัสกับ Hypersomnia ได้เต็มที่
อยากปล่อยลง Steam ก่อนปี 2024
ตอนนี้ยังไม่มี persistent world เลยแม้แต่น้อย แค่พูดถึงทิศทางที่อาจไปต่อได้ในอนาคตแบบทีเซอร์เท่านั้นหากเกมประสบความสำเร็จ
การสร้างฟิสิกส์ขึ้นใหม่ไม่ควรทำให้ตำแหน่งเคลื่อนที่เลย สิ่งที่ถูกสร้างใหม่มีแค่ “สถานะร้อน” อย่างการสัมผัสหรือพวกต้นไม้เท่านั้น และช่วงเวลาที่สถานะนี้มีความหมายก็คือตอนรันซิมูเลชันจากสถานะหนึ่งไปยังสถานะถัดไป ดังนั้นหลังจากนั้นจึงไม่ส่งผลต่อการเรนเดอร์
ผลกระทบเดียวที่อาจเกิดกับผู้เล่นเดิมได้คือเฟรมตกหนึ่งครั้งตอนที่โลกฟิสิกส์ที่ต้องสร้างใหม่มีขนาดใหญ่มาก แต่ในทางปฏิบัติตอนนี้ทุกแมปยังเล็กอยู่ และเหมาะกับการแข่งขัน 3v3 มากที่สุด
อย่างที่สอง ฉันเจอบั๊กใหญ่บน MacOS หน้าจอพักเกม/การตั้งค่ามีปัญหาการรับเมาส์คลาดเคลื่อนอย่างมาก จนคลิกตัวเลือกในเมนูหลักไม่ได้เลย
รวบรวมทั้งวิดีโอบันทึกหน้าจอ, log, และ system report ไว้แล้ว: https://youtu.be/O4OoMdeFAt0
ปกติผมเล่นบน Windows กับ Linux แทบตลอด เลยไม่ได้รันบน MacOS นาน ๆ มาสักพักแล้ว จะลองดูว่าสามารถแก้ได้ไหม
โดยเฉพาะบทความเกี่ยวกับ ECS และเน็ตเวิร์กกิง
ดีใจที่เห็นว่าพัฒนาไปไกลมากขนาดนี้
ตอนอธิบาย deterministic architecture ใน README ผมมีลิงก์ไปยังบทความบล็อกสำคัญของ Glenn Fiedler อยู่ แต่ผมไม่ใช่คนนั้นนะ ถ้าทำให้เข้าใจผิดก็ไม่ได้ตั้งใจ
https://www.freeinfantry.com/
https://en.m.wikipedia.org/wiki/Infantry_(video_game)