2 คะแนน โดย GN⁺ 2024-12-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ทำไมเรื่องนี้จึงยาก

  • ปัญหาความเร็วของ Bash: Bash ทำงานค่อนข้างช้ามาก ดังนั้นหากรันคำสั่งต่อพิกเซล จะไม่สามารถบรรลุอัตราเฟรมที่เหมาะสมได้ หน้าจอไม่สามารถเก็บสถานะลงหน่วยความจำได้ และการเข้าถึงผ่านอาร์เรย์หรือสตริงใช้เวลามาก
  • ข้อจำกัดทางคณิตศาสตร์: Bash ไม่มีการรองรับจำนวนจริงและไม่มียังไหร่ฟังก์ชันคณิตศาสตร์ การคำนวณทั้งหมดจึงทำด้วยจำนวนเต็มและถูกปรับสเกลด้วย 100000
  • ปัญหากราฟิกเทอร์มินัล: เพื่อแสดงพิกเซลจึงใช้ Unicode half-block เพื่อเพิ่มความละเอียดแนวตั้งเป็นสองเท่า ต้องทราบค่าสีของพิกเซลที่อยู่ติดกัน และ Bash ไม่สามารถเก็บสถานะได้
  • ปัญหาอื่น ๆ:
    • การอัปเดตเทอร์มินัลทั้งหน้าจอในครั้งเดียวเป็นเรื่องยาก
    • เทอร์มินัลส่วนใหญ่ไม่ออกแบบมาเพื่อวิดีโอเกม จึงจัดการการรับคีย์แบบเรียลไทม์ได้ยาก
    • ต้องใช้ข้อมูลจำนวนมากเพื่อระบายสีเทอร์มินัล
    • Bash ไม่ได้พิมพ์สตริงหลายบรรทัดพร้อมกัน
    • มาตรฐาน ECMA48, VT100, VT200, Xterm ฯลฯ มีความซับซ้อนและเข้าใจยาก
    • การคำนวณทางคณิตศาสตร์ก็มีปัญหาเช่นกัน

FAQ

  • Q: เมื่อปรับขนาดหน้าต่างแล้วมีปัญหา
    • A: กรุณาเปิด issue
  • Q: CPU ร้อนเกินไปหรือคอมพิวเตอร์เก่าช้าลง
    • A: ตั้งค่า environment variable FPS ให้ต่ำกว่า 30
  • Q: ไม่ทำงานบน Bash เวอร์ชันต่ำกว่า 5
    • A: ใช่
  • Q: โค้ดนี้เป็น Bash ล้วนหรือไม่
    • **A: ไม่ใช่. ตอนเริ่มต้นจะเรียก stty เพื่อปิด echo และเปิดกลับคืนเมื่อจบโปรแกรม

1 ความคิดเห็น

 
GN⁺ 2024-12-22
ความคิดเห็นจาก Hacker News
  • เกมนี้ไม่ใช่เกม 3 มิติจริง ๆ ดังนั้นการใช้งาน ray tracing เพื่อวาดพิกเซลเพียงครั้งเดียวต่อคอลัมน์จึงคิดขึ้นมาช่างเจ๋งมาก

    • เพื่อวาดท้องฟ้า หญ้า และวัตถุจริง ๆ โดยทำซ้ำสตริง "วาดพิกเซลนี้แล้วเลื่อนลง" ลงไปในเทอร์มินัลตามจำนวนที่ต้องการ
    • ผมกำลังพิจารณางานพัฒนาเอนจินเรนเดอร์แบบ voxel สำหรับสภาพแวดล้อมที่มีข้อจำกัดอื่น ๆ และรู้สึกว่าน่าจะหาอะไรที่ใช้ได้จากโปรเจกต์นี้
  • หากอยากรู้ว่ามี raycaster ที่เขียนด้วย MS Batch หรือไม่ สามารถตรวจดูจากลิงก์ GitHub ได้

  • Bash ช้าเกินไปสำหรับงานสคริปต์หรือการใช้งานแบบโต้ตอบในความคิดของผม

    • แม้กระทั่ง distro Linux ยอดนิยมบางตัวก็ไม่ได้ใช้ Bash เป็นสคริปต์เชลล์
  • เสียดายที่ stty ต้องการ fork

    • ในโปรเจกต์ถัดไปอาจหาทางเรียก ioctls ที่จำเป็นผ่าน Bash และ rowhammer โดยไม่ต้อง fork ได้
  • ก็ยังไม่เข้าใจว่าทำไมยังคงต้องใช้ shell ที่ช้าขนาดนี้

    • โดยส่วนใหญ่แล้วแอปส่วนใหญ่ทำแค่อะไรบางอย่างกับ stdout กับ stderr เท่านั้น จึงคิดว่าควรจะพิมพ์ข้อความไปที่หน้าจอได้เร็วกว่า
  • ไม่เคยรู้มาก่อนว่าทำแบบนี้ใน Bash ได้

    • ผมคิดว่าตัวเองเก่ง Bash อยู่แล้ว แต่การทำนี้ทำให้ประหลาดใจ
    • แม้ความเข้าใจด้านคณิตศาสตร์จะไม่มาก แต่การได้เห็นมันก็สนุกดี
  • ควรอ้างอิง raycaster ของ awk ที่ทำขึ้นเมื่อ 9 ปีก่อนได้เช่นกัน

    • คุณสามารถตรวจสอบผ่านลิงก์ GitHub ได้
  • เสียดายที่ไม่สามารถรันโปรเจกต์นี้ได้

    • ไม่รู้ว่าเพราะอะไร แต่มุมมองถูกเก็บไว้ในไฟล์ชื่อ buffered และปิดตัวลงทันที
  • โค้ดมีแค่ 300 บรรทัดก็ยังน่าประทับใจมาก

    • โปรเจกต์นี้เป็นโปรเจกต์ที่ชอบมาก
  • ความท้าทายนี้น่าทึ่งมากจริง ๆ

    • มันน่าอึ้งมากที่คิดว่าสิ่งนี้เป็นไปได้