ทำไมเรื่องนี้จึงยาก
- ปัญหาความเร็วของ Bash: Bash ทำงานค่อนข้างช้ามาก ดังนั้นหากรันคำสั่งต่อพิกเซล จะไม่สามารถบรรลุอัตราเฟรมที่เหมาะสมได้ หน้าจอไม่สามารถเก็บสถานะลงหน่วยความจำได้ และการเข้าถึงผ่านอาร์เรย์หรือสตริงใช้เวลามาก
- ข้อจำกัดทางคณิตศาสตร์: Bash ไม่มีการรองรับจำนวนจริงและไม่มียังไหร่ฟังก์ชันคณิตศาสตร์ การคำนวณทั้งหมดจึงทำด้วยจำนวนเต็มและถูกปรับสเกลด้วย 100000
- ปัญหากราฟิกเทอร์มินัล: เพื่อแสดงพิกเซลจึงใช้ Unicode half-block เพื่อเพิ่มความละเอียดแนวตั้งเป็นสองเท่า ต้องทราบค่าสีของพิกเซลที่อยู่ติดกัน และ Bash ไม่สามารถเก็บสถานะได้
- ปัญหาอื่น ๆ:
- การอัปเดตเทอร์มินัลทั้งหน้าจอในครั้งเดียวเป็นเรื่องยาก
- เทอร์มินัลส่วนใหญ่ไม่ออกแบบมาเพื่อวิดีโอเกม จึงจัดการการรับคีย์แบบเรียลไทม์ได้ยาก
- ต้องใช้ข้อมูลจำนวนมากเพื่อระบายสีเทอร์มินัล
- Bash ไม่ได้พิมพ์สตริงหลายบรรทัดพร้อมกัน
- มาตรฐาน ECMA48, VT100, VT200, Xterm ฯลฯ มีความซับซ้อนและเข้าใจยาก
- การคำนวณทางคณิตศาสตร์ก็มีปัญหาเช่นกัน
FAQ
- Q: เมื่อปรับขนาดหน้าต่างแล้วมีปัญหา
- Q: CPU ร้อนเกินไปหรือคอมพิวเตอร์เก่าช้าลง
- A: ตั้งค่า environment variable
FPS ให้ต่ำกว่า 30
- Q: ไม่ทำงานบน Bash เวอร์ชันต่ำกว่า 5
- Q: โค้ดนี้เป็น Bash ล้วนหรือไม่
- **A: ไม่ใช่. ตอนเริ่มต้นจะเรียก
stty เพื่อปิด echo และเปิดกลับคืนเมื่อจบโปรแกรม
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เกมนี้ไม่ใช่เกม 3 มิติจริง ๆ ดังนั้นการใช้งาน ray tracing เพื่อวาดพิกเซลเพียงครั้งเดียวต่อคอลัมน์จึงคิดขึ้นมาช่างเจ๋งมาก
หากอยากรู้ว่ามี raycaster ที่เขียนด้วย MS Batch หรือไม่ สามารถตรวจดูจากลิงก์ GitHub ได้
Bash ช้าเกินไปสำหรับงานสคริปต์หรือการใช้งานแบบโต้ตอบในความคิดของผม
เสียดายที่ stty ต้องการ fork
ก็ยังไม่เข้าใจว่าทำไมยังคงต้องใช้ shell ที่ช้าขนาดนี้
ไม่เคยรู้มาก่อนว่าทำแบบนี้ใน Bash ได้
ควรอ้างอิง raycaster ของ
awkที่ทำขึ้นเมื่อ 9 ปีก่อนได้เช่นกันเสียดายที่ไม่สามารถรันโปรเจกต์นี้ได้
bufferedและปิดตัวลงทันทีโค้ดมีแค่ 300 บรรทัดก็ยังน่าประทับใจมาก
ความท้าทายนี้น่าทึ่งมากจริง ๆ