- doom-htop là một dự án thử nghiệm dùng danh sách tiến trình của
htop như đầu ra đồ họa để hiển thị màn hình game dòng Doom dưới dạng ASCII
- Để chạy cần có tệp dữ liệu game WAD; kho lưu trữ đã bao gồm freedoom1.wad, còn classic shareware
DOOM1.wad được hướng dẫn tải riêng
- Cách hoạt động là tiến trình Doom tạo các tiến trình con tương ứng với số dòng màn hình, mỗi tiến trình ghi một dòng nhận từ bộ nhớ chia sẻ vào argv[0] của chính nó để dựng khung hình trong vùng tên tiến trình của
htop
- Cần cấu hình
htop để cập nhật tên tiến trình mỗi lần; dùng -d 1 nhằm đạt tần suất làm mới khoảng 10 FPS và -s M_VIRT để sắp xếp theo bộ nhớ ảo
- Nhập liệu bàn phím dùng kiểu keylogger đơn giản mở thiết bị bàn phím, nên có thể cần
sudo; mới chỉ được kiểm thử trên Ubuntu 22.04, còn WSL và Arch cần điều chỉnh đường dẫn thiết bị
Mục tiêu dự án và hình thức chạy
- doom-htop là dự án được tạo ra để kiểm tra liệu
htop có thể dùng để render đồ họa game video cổ điển hay không
- Kết quả là hiển thị Doom như một video ASCII trên danh sách tiến trình của
htop
- Dự án fork từ ozkl/doomgeneric, và các phần nặng liên quan đến việc chạy Doom do dự án đó đảm nhiệm
Build và dữ liệu game cần thiết
- Build được thực hiện trong thư mục
doomgeneric bằng make -j8
cd doomgeneric
make -j8
- Để chạy cần có tệp dữ liệu game WAD
- Kho lưu trữ đã bao gồm
freedoom1.wad, phần ghi công thuộc về The Freedoom project
- Phiên bản classic free shareware
DOOM1.wad có thể tải từ Doom Wiki
DOOM1.wad không được đưa vào vì tác giả không chắc việc tải lên GitHub có hợp pháp hay không
Cách chạy và cấu hình htop
- Có hướng dẫn lưu các công việc quan trọng trước khi chạy; môi trường kiểm thử là Lenovo ThinkPad T430s 12 năm tuổi, RAM 8GB, Intel Core i7-3520M @ 2.90GHz, Ubuntu 22.04 và hoạt động bình thường
- Lệnh chạy mặc định như sau
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
- Chạy
doom-htop hay htop trước đều được
sudo chỉ cần để mở thiết bị bàn phím
- Nếu chạy không có
sudo, việc nhập liệu sẽ khó nhưng vẫn có thể xem màn hình
htop -d 1 là thiết lập nhằm làm mới ở 10 FPS
htop -s M_VIRT là thiết lập để sắp xếp tiến trình theo lượng bộ nhớ ảo được cấp phát, giúp các tiến trình liên quan được gom lại dễ nhìn
- Nếu thứ tự sắp xếp không khớp, có thể điều chỉnh giá trị
PROCS_MALLOC_SIZE trong main.c
- Lệnh
sed cần thiết vì mặc định htop không cập nhật tên tiến trình mỗi lần
Cách hoạt động bên trong
- Kho lưu trữ chủ yếu thêm ba tệp vào
doomgeneric hiện có
main.c
keylogger.c
ascii_stuff.c
ascii_stuff.c chứa một chuỗi câu lệnh if dài do một bộ chuyển đổi image-to-ASCII đơn giản tạo ra
- Tiến trình Doom chính dùng
fork để tạo số tiến trình tương ứng với số dòng của ảnh đã chuyển đổi sang ASCII
- Tiến trình chính tạo segment bộ nhớ chia sẻ với từng tiến trình con và sao chép từng dòng của ảnh vào segment bộ nhớ của tiến trình tương ứng
- Mỗi tiến trình con sao chép nội dung từ segment của mình rồi ghi đè lên
argv[0]
htop cập nhật giá trị argv[0] được hiển thị dưới dạng tên tiến trình, qua đó hiển thị từng dòng của màn hình
Ý tưởng sắp xếp và xử lý nhập liệu
- Ý tưởng ban đầu là sắp xếp theo mức sử dụng CPU và tạo các tiến trình tiêu thụ một mức CPU nhất định, nhưng việc triển khai khó
- Giá trị
nice của Linux cũng được cân nhắc, nhưng người dùng thông thường chỉ có 19 giá trị khả dụng nên được cho là không đủ để tạo đồ họa tốt hơn
- Cuối cùng, tác giả dùng lượng bộ nhớ ảo được cấp phát, vì cho rằng có thể điều chỉnh khá cụ thể theo từng tiến trình
- Ngay cả khi mọi tiến trình fork cấp phát cùng một lượng bộ nhớ, trên hệ thống kiểm thử
htop vẫn hiển thị khung hình đúng thứ tự
- Tác giả phỏng đoán khi hòa nhau, có thể tiến trình được sắp xếp theo thời điểm tạo
- Tuy nhiên không chắc trên hệ thống khác sẽ hoạt động thế nào, nên không phụ thuộc vào cùng một giá trị
- Phím bấm được xử lý bằng một keylogger đơn giản mở thiết bị bàn phím
- Nhờ cách này, game vẫn tiếp tục chạy trong nền ngay cả khi
htop không mở
Nền tảng và xử lý sự cố
- Việc kiểm thử chỉ được thực hiện trên Ubuntu 22.04
- Trên WSL và Arch, tên thiết bị bàn phím khác nhau và cần port lại
- Nếu bàn phím không hoạt động, cần kiểm tra giá trị
#define KEYBOARD_DEVICE trong main.c
- Có hướng dẫn tìm và chọn mục chứa
kbd trong /dev/input/by-path
- Nếu khung hình bị đứng, có thể lệnh
sed chưa được áp dụng
- Có thể thiết lập thủ công trong
htop bằng cách vào F2 → “Display options” → chọn “Update process names on every refresh”
- Lỗi không có
~/.config/htop/htoprc có thể xảy ra khi chưa từng chạy htop
- Chỉ cần chạy
htop rồi thoát, sau đó chạy lại lệnh sed
- Nếu tiến trình Doom chính bị crash và để lại nhiều tiến trình zombie, dọn dẹp bằng lệnh sau
sudo pkill doom-htop
Việc còn lại và giấy phép
htop sẽ di chuyển màn hình khi dùng phím mũi tên, có thể gây bất tiện khi điều khiển game
- Một cách né đơn giản được đề xuất là sau khi bắt đầu game, nhấn
a để chuyển focus sang menu chọn processor
- Lý do tạo ra dự án là funny
- Freedoom được phân phối theo giấy phép kiểu BSD trong
freedoom-license.txt ở thư mục chính
- Phần mã còn lại được ghi chú là có vẻ theo GPL
1 bình luận
Các ý kiến trên Hacker News
Nghĩ lại thì việc render “video” thành ASCII rồi đưa vào tên tiến trình trông cũng khá dễ
Nó giống các dự án đồ chơi chạy trên DNS, và README cũng nói phần lớn công việc là do dự án khác làm, nên có thể không có vẻ gì đặc biệt
Nhưng mặt khác, có lẽ tôi chưa từng nghĩ có thể xem htop như một rendering engine cho thứ gì đó, nên đây thật sự là một màn hack phần mềm đáng ngạc nhiên và ấn tượng
Chỉ cần nhìn libaa hay libcaca cũng thấy có những ví dụ đã dành hàng trăm giờ cho chủ đề này
Có lẽ giống PSDoom[1] đảo ngược
Bài này là chơi Doom bằng trình quản lý tiến trình, còn PSDoom là quản lý tiến trình bằng Doom
[1]: https://psdoom.sourceforge.net
Còn có video port để chạy trên Linux hiện nay: https://youtu.be/Pf7rpde49NU
Tuy vậy sẽ hay hơn nếu nó thực sự hữu ích hơn một chút như một bản thay thế top. Kích thước quái vật dựa trên mức dùng bộ nhớ, độ hung hãn dựa trên mức dùng CPU, các phòng chia theo từng người dùng, đồng thời hiển thị được quan hệ giữa thread và tiến trình cha/con
Các tiến trình đang ngủ tất nhiên sẽ ngủ, còn tiến trình zombie có thể bị đóng băng tại chỗ trong không gian hoặc trong suốt để đi xuyên qua được. Vũ khí thì ánh xạ với các tín hiệu kill
Còn nhiều thứ có thể thêm, nhưng như vậy sẽ ngày càng xa Doom
rm -rfchắc sẽ thú vịTôi thật sự tò mò không biết người ta lấy đâu ra thời gian để làm những thứ như thế này
Càng thấy những thứ tuyệt vời như vậy, tôi càng mất dần niềm tin vào năng lực của mình
Có người nói là tận dụng công việc trước đó, render lại thành ASCII rồi ánh xạ vào các tiến trình, nhưng như thế tuyệt đối không phải là ít việc
Tôi tự hỏi mất bao lâu, và dù đã ở trong ngành này khá lâu, tôi vẫn có cảm giác mình chẳng biết gì. Rất ngầu, nhưng khiến tôi thấy mình cực kỳ ngốc
Rất có thể bạn biết nhiều hơn rất nhiều so với bạn nghĩ
Công việc này được làm trong trọn một cuối tuần cộng khoảng một ngày, rồi thêm vài ngày làm lắt nhắt khi có thời gian
Như tôi đã viết ở đâu đó trong phần bình luận và trong README, phần khó là làm cho Doom dễ port hơn thì dự án fork doom-generic đã làm sẵn: https://github.com/ozkl/doomgeneric
Dù phải ăn, ngủ, tắm rửa và làm đủ thứ khác, nhưng nếu không bận tâm đến mấy việc đó thì vẫn nguyên 15 tiếng
3 năm là đủ thời gian để làm
Giờ tôi phải hoàn tất nốt raycaster cho 6502
Nó giống như phiên bản lập trình viên của việc nhìn ảnh nhà cửa hoàn hảo bạn bè đăng trên Instagram rồi tự bào mòn lòng tự trọng
Hầu hết mọi người thỉnh thoảng đều cảm thấy vậy, và cũng có cách đối phó, nhưng đó là tác dụng phụ rất bình thường khi ở quanh những người thông minh
Trào lưu “nhét Doom vào thứ gì đó” có cảm giác gần như đã đạt đến giai đoạn hoàn thiện, và giờ đã đến lúc bắt đầu nhét các thứ thường ngày vào trong Doom
Cứ tưởng tượng danh sách Todo hay lịch nằm trong Doom
Về phía ứng dụng Todo thì đã có Doom được render bằng checkbox rồi[1], nên việc tích hợp nó vào ứng dụng Todo có thể để lại như bài tập cho độc giả
[1]: https://healeycodes.github.io/doom-checkboxes/
Tôi tình cờ thấy dự án này khoảng một tuần trước và đã đăng lên đây nhưng không có phản hồi
Giờ thấy nó lên trang nhất thì thật vui, và tôi thích việc những dự án hack vui là chính như thế này được đưa lên
Một màn hack xuất sắc
Thấy tinh thần hacker vẫn còn sống khiến tôi rất vui
Đôi khi con người đưa công nghệ đi quá xa, nhưng lần này thì không phải trường hợp đó
Làm tôi nhớ đến Bad Apple chạy trong Windows Task Manager
https://youtu.be/sBeI30ccb6g
Một sự điên rồ thuần khiết và tuyệt vời. A+
Không thể tưởng tượng nổi sau này trò chơi này còn sẽ chạy ở đâu nữa