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

สร้าง DOOM ด้วย htop

วิธีบิลด์

  • เข้าไปที่ไดเรกทอรี doomgeneric
  • บิลด์ด้วยคำสั่ง make -j8
  • ต้องมีไฟล์ WAD (ข้อมูลเกม) โดยโปรเจกต์นี้มี freedoom1.wad รวมมาให้แล้ว (เครดิตทั้งหมดให้โปรเจกต์ Freedoom) หรือจะดาวน์โหลดเวอร์ชันแชร์แวร์ฟรีแบบคลาสสิก DOOM1.wad มาใช้ก็ได้

วิธีรัน

  • แนะนำให้บันทึกงานสำคัญไว้ล่วงหน้า
  • ยืนยันแล้วว่าทำงานได้ดีแม้บนโน้ตบุ๊กเก่า
  • รันคำสั่งด้านล่าง:
    sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
    sudo ./doom-htop -iwad freedoom1.wad
    htop -d 1 -s M_VIRT
    
  • ลำดับการรัน doom-htop กับ htop ไม่สำคัญ
  • ต้องใช้ sudo เพื่อเปิดอุปกรณ์คีย์บอร์ด หากกังวลเรื่องความปลอดภัย สามารถรันโดยไม่ใช้ sudo และดูกราฟิกอย่างเดียวได้
  • -d 1 ของ htop ใช้เพื่อให้อัตรารีเฟรช 10 FPS และ -s M_VIRT ใช้เพื่อเรียงโปรเซสตามการจัดสรรหน่วยความจำเสมือน
  • คำสั่ง sed จำเป็นเพราะโดยปกติ htop จะไม่อัปเดตชื่อโปรเซสทุกครั้ง

หลักการทำงาน

  • พัฒนาต่อโดยฟอร์กจากโปรเจกต์ 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 ชื่ออุปกรณ์คีย์บอร์ดต่างกัน จึงต้องพอร์ตเพิ่มเติม

การแก้ปัญหา

  1. ถ้าคีย์บอร์ดไม่ทำงาน
    • ตรวจสอบแมโคร KEYBOARD_DEVICE ใน main.c ซึ่งอาจต่างกันในแต่ละแพลตฟอร์ม
    • ใช้คำสั่ง ll /dev/input/by-path แล้วเลือกอุปกรณ์ที่มี kbd อยู่ในชื่อ
  2. ถ้าเฟรมค้าง
    • คำสั่ง sed อาจทำงานไม่สำเร็จ
    • ใน htop กด F2 -> "Display options" -> ติ๊ก "Update process names on every refresh"
  3. ข้อผิดพลาด sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory
    • เกิดจากยังไม่เคยรัน htop ให้รัน htop หนึ่งครั้งแล้วปิด จากนั้นรัน sed อีกครั้ง
  4. ถ้าโปรเซส doom หลักตายและเหลือแต่ซอมบี้โปรเซส
    • รัน sudo pkill doom-htop

สิ่งที่ควรปรับปรุง

  • เวลาเคลื่อนที่ด้วยปุ่มลูกศร หน้าจอ htop จะเลื่อนไปด้วย ทำให้ใช้งานไม่สะดวก
  • แก้ได้โดยเปลี่ยนโฟกัสหลังจากเริ่ม htop (เช่น กดปุ่ม a เพื่อเปิดเมนูเลือกโปรเซสเซอร์)

FAQ

  1. 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 ความคิดเห็น

 
GN⁺ 2024-04-22
ความเห็นจาก Hacker News

ความคิดเห็นเหล่านี้เป็นปฏิกิริยาต่อโปรเจกต์ที่รันเกม Doom ที่เรนเดอร์แบบ ASCII เป็นโปรเซสโดยใช้ htop โดยมีประเด็นหลักดังนี้:

  • การเปรียบเทียบกับ PSDoom: ขณะที่ PSDoom ใช้ Doom เพื่อจัดการโปรเซส โปรเจกต์นี้กลับทำในทางตรงกันข้าม คือใช้ตัวจัดการโปรเซสเพื่อเล่น Doom
  • การประเมินเชิงเทคนิค: การเรนเดอร์เป็น ASCII แล้วใส่ลงในชื่อโปรเซสนั้นไม่ใช่เรื่องยากในตัวมันเอง แต่แนวคิดที่ใช้ htop เป็นเอนจินเรนเดอร์นั้นน่าประทับใจและแสดงให้เห็นถึงแก่นแท้ของการแฮ็กซอฟต์แวร์
  • ความเคารพต่อความสามารถของนักพัฒนา: เมื่อเห็นนักพัฒนาที่มีทั้งเวลาและความสามารถในการสร้างโปรเจกต์แบบนี้ ก็ทำให้รู้สึกสูญเสียความมั่นใจในความสามารถของตัวเอง
  • เทรนด์การผสาน Doom: ตอนนี้อาจถึงขั้นลองคิดดูได้แล้วว่าจะผสานสิ่งธรรมดาในชีวิตประจำวันเข้ากับ Doom อย่างไร เช่น รายการสิ่งที่ต้องทำหรือปฏิทิน
  • การยกย่องจิตวิญญาณแฮ็กเกอร์: เป็นเรื่องน่ายินดีที่โปรเจกต์แฮ็กเพื่อความสนุกได้รับความนิยม และแสดงให้เห็นว่าจิตวิญญาณแฮ็กเกอร์ยังคงมีชีวิตอยู่
  • ชวนให้นึกถึง Bad Apple: ทำให้นึกถึงวิดีโอ Bad Apple ที่เคยทำบน Windows Task Manager
  • อนาคตของ Doom: ยากจะจินตนาการได้ว่าในอนาคต Doom จะถูกทำให้ไปรันได้ไกลแค่ไหน