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
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ố
- 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
- 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"
- 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
- 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
- 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
Ý 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: