สร้าง DOOM ด้วย htop
วิธีบิลด์
- เข้าไปที่ไดเรกทอรี
doomgeneric
- บิลด์ด้วยคำสั่ง
make -j8
- ต้องมีไฟล์ WAD (ข้อมูลเกม) โดยโปรเจกต์นี้มี
freedoom1.wad รวมมาให้แล้ว (เครดิตทั้งหมดให้โปรเจกต์ Freedoom) หรือจะดาวน์โหลดเวอร์ชันแชร์แวร์ฟรีแบบคลาสสิก DOOM1.wad มาใช้ก็ได้
วิธีรัน
หลักการทำงาน
- พัฒนาต่อโดยฟอร์กจากโปรเจกต์ https://github.com/ozkl/doomgeneric
- เพิ่มไฟล์
main.c, keylogger.c, ascii_stuff.c และแก้ไขบางส่วน
- เขียนตัวแปลงภาพเป็น ASCII แบบง่าย (
if ยาว ๆ ใน ascii_stuff.c)
- โปรเซส doom หลักจะสร้างโปรเซสลูกตามจำนวนบรรทัดของภาพ ASCII และสร้างเซกเมนต์หน่วยความจำที่ใช้ร่วมกันกับแต่ละโปรเซส
- โปรเซสหลักจะคัดลอกแต่ละบรรทัดไปยังเซกเมนต์หน่วยความจำของโปรเซสนั้น และแต่ละโปรเซสลูกจะอ่านจากเซกเมนต์ของตัวเองแล้วเขียนทับ
argv[0]
- เดิมทีตั้งใจจะเรียงโปรเซสตามการใช้งาน CPU แต่ทำได้ยาก แม้จะพิจารณา
nice ของลินุกซ์แล้วก็เลิกไป เพราะค่าที่ผู้ใช้ตั้งได้มีแค่ 19 ค่า
- จึงนึกไอเดียใช้ปริมาณการจัดสรรหน่วยความจำเสมือน ซึ่งกำหนดให้เฉพาะแต่ละโปรเซสได้
- แม้โปรเซสลูกทั้งหมดจะจัดสรรหน่วยความจำเท่ากันทุกประการ เฟรมก็ยังแสดงในลำดับที่ถูกต้องบน
htop น่าจะเป็นเพราะกรณีค่าเท่ากันจะเรียงตามเวลาที่สร้าง
- เขียนคีย์ล็อกเกอร์อย่างง่ายเพื่อเปิดอุปกรณ์คีย์บอร์ด เกมจะรันอยู่เบื้องหลังตลอดไม่ว่าจะเปิด
htop หรือไม่ก็ตาม
แพลตฟอร์มที่รองรับ
- ทดสอบเฉพาะบน Ubuntu 22.04
- บน WSL และ Arch ชื่ออุปกรณ์คีย์บอร์ดต่างกัน จึงต้องพอร์ตเพิ่มเติม
การแก้ปัญหา
- ถ้าคีย์บอร์ดไม่ทำงาน
- ตรวจสอบแมโคร
KEYBOARD_DEVICE ใน main.c ซึ่งอาจต่างกันในแต่ละแพลตฟอร์ม
- ใช้คำสั่ง
ll /dev/input/by-path แล้วเลือกอุปกรณ์ที่มี kbd อยู่ในชื่อ
- ถ้าเฟรมค้าง
- คำสั่ง
sed อาจทำงานไม่สำเร็จ
- ใน
htop กด F2 -> "Display options" -> ติ๊ก "Update process names on every refresh"
- ข้อผิดพลาด
sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory
- เกิดจากยังไม่เคยรัน
htop ให้รัน htop หนึ่งครั้งแล้วปิด จากนั้นรัน sed อีกครั้ง
- ถ้าโปรเซส doom หลักตายและเหลือแต่ซอมบี้โปรเซส
สิ่งที่ควรปรับปรุง
- เวลาเคลื่อนที่ด้วยปุ่มลูกศร หน้าจอ
htop จะเลื่อนไปด้วย ทำให้ใช้งานไม่สะดวก
- แก้ได้โดยเปลี่ยนโฟกัสหลังจากเริ่ม
htop (เช่น กดปุ่ม a เพื่อเปิดเมนูเลือกโปรเซสเซอร์)
FAQ
- Q: ทำไมถึงสร้างมันขึ้นมา?
A: เพราะคิดว่าน่าจะสนุกดี
ไลเซนส์
- Freedoom ใช้ไลเซนส์สไตล์ BSD (ดู
freedoom-license.txt)
- โค้ดส่วนที่เหลือน่าจะเป็น GPL
ความเห็นจาก GN⁺
- การแสดงภาพเกม 3D ด้วย ASCII art เป็นไอเดียที่สดใหม่ และน่าจะเป็นตัวอย่างที่ดีของการวาดกราฟิกบนหน้าจอแบบ htop ด้วย C
- ไม่ได้แค่เปลี่ยนหน้าจอเป็น ASCII art อย่างเดียว แต่ทำงานร่วมกับเกมเอนจินจริงด้วย ซึ่งน่าประทับใจ
- การนำโปรเจกต์
doomgeneric เดิมมาใช้ได้อย่างดีและสร้างสิ่งนี้ขึ้นมาด้วยโค้ดไม่มากก็น่าชื่นชม
- การเปิดอุปกรณ์ลินุกซ์โดยตรงเพื่อรับอินพุตจากคีย์บอร์ดอาจไม่ทำงานบน WSL หรือระบบปฏิบัติการอื่น ควรพิจารณาใช้ไลบรารีรับคีย์อินพุตที่ไม่ผูกกับ OS
- แนวคิดการใช้หน่วยความจำที่ใช้ร่วมกันเพื่อส่งข้อมูลเฟรม ASCII ระหว่างโปรเซสแม่-ลูกน่าสนใจ และเป็นตัวอย่างที่ดีสำหรับการศึกษา IPC
- ไอเดียการใส่กราฟิก ASCII ลงในชื่อโปรเซสของ
htop ก็สร้างสรรค์เช่นกัน แต่ htop เองก็มีผลข้างเคียง เช่น หน้าจอขยับตามการเปลี่ยนชื่อโปรเซส ซึ่งดูว่ายังต้องปรับปรุง
- คาดว่าน่าจะใช้ไลเซนส์ GPL แต่ยังไม่ชัดเจน หากจะนำโค้ดไปใช้ซ้ำควรตรวจสอบไลเซนส์ก่อน
1 ความคิดเห็น
ความเห็นจาก Hacker News
ความคิดเห็นเหล่านี้เป็นปฏิกิริยาต่อโปรเจกต์ที่รันเกม Doom ที่เรนเดอร์แบบ ASCII เป็นโปรเซสโดยใช้ htop โดยมีประเด็นหลักดังนี้: