2 điểm bởi GN⁺ 2024-04-22 | 1 bình luận | Chia sẻ qua WhatsApp

Triển khai DOOM bằng htop

Cách build

  • Di chuyển vào thư mục doomgeneric
  • Build bằng lệnh make -j8
  • Cần có tệp WAD (dữ liệu game). Dự án này đã bao gồm freedoom1.wad (toàn bộ credit thuộc về dự án Freedoom). Hoặc cũng có thể tải và dùng phiên bản shareware miễn phí cổ điển DOOM1.wad

Cách chạy

  • Khuyến nghị lưu trước các công việc quan trọng
  • Đã xác nhận chạy tốt cả trên laptop cũ
  • Chạy các lệnh bên dưới:
    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
    
  • Thứ tự chạy doom-htophtop không quan trọng
  • Cần sudo để mở thiết bị bàn phím. Nếu lo ngại về an toàn, có thể chạy không có sudo để chỉ xem phần đồ họa
  • htop với -d 1 là để có tốc độ làm tươi 10 FPS. -s M_VIRT là để sắp xếp tiến trình theo lượng bộ nhớ ảo được cấp phát
  • Lệnh sed là cần thiết vì htop mặc định không cập nhật tên tiến trình ở mỗi lần làm tươi

Nguyên lý hoạt động

  • Được thực hiện bằng cách fork dự án https://github.com/ozkl/doomgeneric
  • Thêm các tệp main.c, keylogger.c, ascii_stuff.c và sửa đổi một số phần
  • Tự viết một bộ chuyển đổi ảnh sang ASCII đơn giản (chuỗi if dài trong ascii_stuff.c)
  • Tiến trình doom chính tạo các tiến trình con tương ứng với số dòng của ảnh ASCII, đồng thời tạo các phân đoạn bộ nhớ dùng chung với từng tiến trình
  • Tiến trình chính sao chép từng dòng vào phân đoạn bộ nhớ của tiến trình tương ứng, còn mỗi tiến trình con sẽ đọc từ phân đoạn của mình rồi ghi đè argv[0]
  • Ban đầu tác giả định sắp xếp tiến trình theo mức dùng CPU nhưng thấy khó. Cũng đã cân nhắc nice của Linux, nhưng vì người dùng chỉ có thể đặt 19 giá trị nên bỏ qua
  • Sau đó nảy ra ý tưởng dùng lượng bộ nhớ ảo được cấp phát. Mỗi tiến trình sẽ có một giá trị riêng
  • Ngay cả khi tất cả tiến trình con cấp phát chính xác cùng một lượng bộ nhớ, htop vẫn hiển thị frame theo đúng thứ tự. Có lẽ trong trường hợp bằng nhau thì nó sắp xếp theo thời điểm tạo tiến trình
  • Viết một keylogger đơn giản để mở thiết bị bàn phím. Game luôn chạy nền bất kể có chạy htop hay không

Nền tảng hỗ trợ

  • Mới chỉ được thử nghiệm trên Ubuntu 22.04
  • Trên WSL và Arch, tên thiết bị bàn phím khác nhau. Cần port thêm

Khắc phục sự cố

  1. Nếu bàn phím không hoạt động
    • Kiểm tra macro KEYBOARD_DEVICE trong main.c. Nó có thể khác tùy nền tảng
    • Chạy lệnh ll /dev/input/by-path để chọn thiết bị có chứa kbd
  2. Nếu frame bị đứng
    • Có thể lệnh sed không hoạt động
    • Trong htop, vào F2 -> "Display options" -> đánh dấu "Update process names on every refresh"
  3. Lỗi sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory
    • Xảy ra vì chưa từng chạy htop. Hãy chạy htop một lần rồi thoát ra và chạy lại sed
  4. Nếu tiến trình doom chính chết và chỉ còn lại tiến trình zombie
    • Chạy sudo pkill doom-htop

Điểm cần cải thiện

  • Khi di chuyển bằng phím mũi tên, màn hình htop cũng di chuyển theo nên khá bất tiện
  • Có thể giải quyết bằng cách đổi focus sau khi htop khởi động (ví dụ: nhấn phím a để mở menu chọn bộ xử lý)

FAQ

  1. Q: Tại sao lại làm cái này? A: Vì thấy có vẻ vui.

Giấy phép

  • Freedoom dùng giấy phép kiểu BSD (xem freedoom-license.txt)
  • Phần mã còn lại được cho là GPL

Ý kiến của GN⁺

  • Biểu diễn màn hình game 3D bằng ASCII art là một ý tưởng mới lạ. Đây có vẻ là một ví dụ hay về cách vẽ đồ họa trên màn hình kiểu htop bằng C
  • Điểm ấn tượng là không chỉ đơn thuần đổi màn hình sang ASCII art, mà còn triển khai gắn với chính game engine thực tế
  • Việc tận dụng tốt dự án doomgeneric có sẵn để hiện thực hóa bằng lượng mã ít cũng rất đáng ghi nhận
  • Việc mở trực tiếp thiết bị Linux để nhận input bàn phím có thể sẽ không chạy được trên WSL hay các môi trường OS khác. Có thể cân nhắc dùng thư viện nhập bàn phím độc lập với hệ điều hành
  • Ý tưởng dùng bộ nhớ chia sẻ để trao đổi dữ liệu frame ASCII giữa tiến trình cha và con khá thú vị. Đây cũng là ví dụ tốt để học về IPC
  • Ý tưởng đưa đồ họa ASCII vào tên tiến trình của htop cũng rất sáng tạo. Tuy nhiên, htop có những tác dụng phụ như màn hình bị xê dịch khi tên tiến trình thay đổi. Có vẻ vẫn cần cải thiện
  • Mã có vẻ được xem là theo giấy phép GPL, nhưng chưa thật sự rõ ràng. Nếu tái sử dụng mã thì cần kiểm tra giấy phép

1 bình luận

 
GN⁺ 2024-04-22
Ý kiến Hacker News

Các bình luận này phản ánh phản ứng đối với một dự án chạy trò chơi Doom được render bằng ASCII như một tiến trình bằng cách dùng htop. Nội dung chính như sau:

  • So sánh với PSDoom: Trong khi PSDoom dùng Doom để quản lý tiến trình, dự án này làm điều ngược lại: dùng trình quản lý tiến trình để chơi Doom.
  • Đánh giá kỹ thuật: Việc render bằng ASCII rồi đưa vào tên tiến trình tự nó không quá khó, nhưng ý tưởng dùng htop làm engine render thì rất ấn tượng và thể hiện đúng tinh thần tinh túy của software hacking.
  • Sự ngưỡng mộ đối với năng lực của nhà phát triển: Nhìn những nhà phát triển có cả thời gian lẫn năng lực để làm ra các dự án như thế này khiến người ta mất tự tin vào khả năng của chính mình.
  • Xu hướng tích hợp Doom: Giờ đây có lẽ cũng đáng để nghĩ đến việc tích hợp những thứ đời thường vào Doom. Có thể tưởng tượng ra danh sách việc cần làm hay lịch chẳng hạn.
  • Ca ngợi tinh thần hacker: Thật vui khi thấy các dự án hack cho vui như thế này được yêu thích, và điều đó cho thấy tinh thần hacker vẫn còn sống.
  • Gợi nhớ đến Bad Apple: Gợi nhớ đến video Bad Apple được triển khai trong Windows Task Manager.
  • Tương lai của Doom: Thật khó tưởng tượng trong tương lai Doom còn có thể được triển khai đến mức nào.