2 คะแนน โดย GN⁺ 2023-06-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2023-06-26
ความคิดเห็นจาก Hacker News
  • ไม่เคยรู้มาก่อนเลยว่าถ้าจะให้ได้ พฤติกรรมที่กำหนดได้ 100% ใน floating-point แม้จะใช้ฟังก์ชันคณิตศาสตร์เดียวกันก็ยังต้องใช้คอมไพเลอร์ตัวเดียวกันด้วย
    เคยสงสัยว่าคณิตศาสตร์ 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 แบบซอฟต์แวร์ และถ้าใช้คอมไพเลอร์แบบเดียวกันด้วยก็น่าจะหลุดพ้นจากปัญหาส่วนใหญ่ได้
    • มีบทความยาวพอสมควรจากยุค Sun แต่ตอนนี้เป็นของ Oracle แล้ว เลยคิดว่าอ่านบทสรุปก่อนแล้วค่อยไล่ย้อนกลับน่าจะง่ายกว่า
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • เรื่อง determinism ของ floating-point ในทางทฤษฎีเหมือนควรจะทำงานแบบกำหนดได้ แต่ในทางปฏิบัติกลับใกล้เคียง แดนเถื่อน มาก
      ใน C และภาษาอื่น ๆ อีกหลายภาษา โอเปอเรเตอร์ที่ใช้กันทั่วไปไม่ได้ถูกแมปอย่างชัดเจนไปยังโอเปอเรชัน floating-point เฉพาะตัว ทำให้คอมไพเลอร์มีดุลยพินิจสูงมาก
      อีกทั้งยังมี สถานะ global ที่มองไม่เห็น อย่างโหมดการปัดเศษที่ถูกใช้อยู่บ้าง เท่าที่จำได้ DirectX เคยแอบเปลี่ยนแฟล็กพวกนี้อยู่เบื้องหลัง
    • ต่อให้ใช้คอมไพเลอร์ตัวเดียวกัน ถ้า -march ต่างกัน ผลลัพธ์ก็อาจต่างกันมากพอสมควร
  • ส่วนที่บอกว่า “ระบบเน็ตเวิร์กอิงอยู่บน determinism ของการจำลองข้ามแพลตฟอร์ม” นั้น Springrts[0] ก็ทำแบบนี้มาตั้งแต่ปลายยุค 2000 ด้วยเหตุผลเดียวกัน และ RTS อีกมากก็น่าจะทำคล้ายกัน
    เพียงแต่ไม่ได้เป็นโอเพนซอร์ส และไม่ได้หมายความว่านี่ไม่ใช่ความสำเร็จ เพราะของแบบนี้ยากมากจริง ๆ
    [0] https://springrts.com/
    • รายละเอียดส่วนนั้นอยู่ใต้หัวข้อที่ถูกอ้างถึง
      ความต่างในที่นี้คือเกม RTS ไม่ได้ใช้ ฟิสิกส์ floating-point แบบกำหนดได้ ดังนั้น Hypersomnia จึงต้องการแนวทางใหม่
    • Spring อยู่กับ Balanced Annihilation มานานมาก
      มันเข้ามาเติมช่องว่างที่ 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 ส่งผลต่อเกมเพลย์อย่างไร
    แล้วเทคนิคอันชาญฉลาดในการสร้างสถานะฟิสิกส์กลับขึ้นมาใหม่ตอนผู้เล่นใหม่เข้ามา มันแสดงผลกับผู้เล่นเดิมอย่างไรด้วย เช่น ตำแหน่งกระสุนมีการขยับหรือไม่
    • ช่วงหลังมานี้ผมทำ โปรแกรมมิงด้านเกมเพลย์ ให้มินิเกมนี้ของ PUBG: https://www.youtube.com/watch?v=tSP5P0QGWa4
      อีกทั้งยังลงทุนเงินเก็บได้ดีพอ จึงโฟกัสกับ Hypersomnia ได้เต็มที่
      อยากปล่อยลง Steam ก่อนปี 2024

ตอนนี้ยังไม่มี persistent world เลยแม้แต่น้อย แค่พูดถึงทิศทางที่อาจไปต่อได้ในอนาคตแบบทีเซอร์เท่านั้นหากเกมประสบความสำเร็จ
การสร้างฟิสิกส์ขึ้นใหม่ไม่ควรทำให้ตำแหน่งเคลื่อนที่เลย สิ่งที่ถูกสร้างใหม่มีแค่ “สถานะร้อน” อย่างการสัมผัสหรือพวกต้นไม้เท่านั้น และช่วงเวลาที่สถานะนี้มีความหมายก็คือตอนรันซิมูเลชันจากสถานะหนึ่งไปยังสถานะถัดไป ดังนั้นหลังจากนั้นจึงไม่ส่งผลต่อการเรนเดอร์
ผลกระทบเดียวที่อาจเกิดกับผู้เล่นเดิมได้คือเฟรมตกหนึ่งครั้งตอนที่โลกฟิสิกส์ที่ต้องสร้างใหม่มีขนาดใหญ่มาก แต่ในทางปฏิบัติตอนนี้ทุกแมปยังเล็กอยู่ และเหมาะกับการแข่งขัน 3v3 มากที่สุด

  • การสร้างสถานะฟิสิกส์ขึ้นใหม่เมื่อไคลเอนต์เชื่อมต่อ เป็นวิธีแก้ปัญหาการซิงก์ที่ยอดเยี่ยม
  • อย่างแรกเลย มันดูเจ๋งแบบเหลือเชื่อจริง ๆ และพอเห็นอะไรแบบนี้ก็ยิ่งทำให้รู้สึกอีกครั้งว่าฉันรู้น้อยแค่ไหนเกี่ยวกับวิทยาการคอมพิวเตอร์
    อย่างที่สอง ฉันเจอบั๊กใหญ่บน MacOS หน้าจอพักเกม/การตั้งค่ามีปัญหาการรับเมาส์คลาดเคลื่อนอย่างมาก จนคลิกตัวเลือกในเมนูหลักไม่ได้เลย
    รวบรวมทั้งวิดีโอบันทึกหน้าจอ, log, และ system report ไว้แล้ว: https://youtu.be/O4OoMdeFAt0
    • ขอโทษเรื่องปัญหาบน MacOS
      ปกติผมเล่นบน Windows กับ Linux แทบตลอด เลยไม่ได้รันบน MacOS นาน ๆ มาสักพักแล้ว จะลองดูว่าสามารถแก้ได้ไหม
  • โอ้แฮะ เพิ่งมารู้ตัวตอนนี้ว่าตลอดหลายปีมานี้ฉันเผลอตามอ่านบทความของคุณไปหลายชิ้น
    โดยเฉพาะบทความเกี่ยวกับ ECS และเน็ตเวิร์กกิง
    ดีใจที่เห็นว่าพัฒนาไปไกลมากขนาดนี้
    • ผมเคยเขียนโพสต์เกี่ยวกับ ECS บน Stack Exchange เมื่อปี 2013 แต่คิดว่านี่เป็นครั้งแรกที่ผมเผยแพร่บทความเกี่ยวกับเน็ตเวิร์กกิงแบบจริงจัง
      ตอนอธิบาย deterministic architecture ใน README ผมมีลิงก์ไปยังบทความบล็อกสำคัญของ Glenn Fiedler อยู่ แต่ผมไม่ใช่คนนั้นนะ ถ้าทำให้เข้าใจผิดก็ไม่ได้ตั้งใจ
  • เกมเพลย์ทำให้นึกถึง Infantry Online เกมยิงมัลติเพลเยอร์มุมมองจากด้านบนรุ่นเก่ายุคต้นทศวรรษ 2000
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)