htop में DOOM इम्प्लीमेंट करना
बिल्ड करने का तरीका
doomgeneric डायरेक्टरी में जाएँ
make -j8 कमांड से बिल्ड करें
- WAD फ़ाइल (गेम डेटा) आवश्यक है। इस प्रोजेक्ट में
freedoom1.wad शामिल है (सारा श्रेय Freedoom प्रोजेक्ट को)। या क्लासिक मुफ़्त shareware वर्ज़न DOOM1.wad डाउनलोड करके इस्तेमाल किया जा सकता है
चलाने का तरीका
यह कैसे काम करता है
- https://github.com/ozkl/doomgeneric प्रोजेक्ट को fork करके इस पर काम किया गया
main.c, keylogger.c, ascii_stuff.c फ़ाइलें जोड़ी गईं और कुछ बदलाव किए गए
- एक सरल image-to-ASCII converter लिखा गया (
ascii_stuff.c का लंबा if स्टेटमेंट)
- मुख्य doom प्रोसेस ASCII इमेज की लाइनों की संख्या के बराबर child processes बनाता है, और हर प्रोसेस के लिए shared memory segment बनाता है
- मुख्य प्रोसेस हर लाइन को संबंधित प्रोसेस के memory segment में कॉपी करता है, और हर child प्रोसेस अपने segment से पढ़कर
argv[0] को overwrite करता है
- शुरुआत में CPU usage के आधार पर प्रोसेस sort करने की कोशिश की गई, लेकिन यह कठिन था। Linux के
nice पर भी विचार किया गया, लेकिन यूज़र द्वारा सेट किए जा सकने वाले मान केवल 19 ही हैं, इसलिए छोड़ दिया गया
- virtual memory allocation उपयोग करने का विचार आया। यह हर प्रोसेस के लिए विशिष्ट होता है
- भले ही सभी child processes बिल्कुल समान memory allocate करें,
htop में फ़्रेम सही क्रम में दिखते हैं। शायद समान स्थिति में यह creation time के क्रम में sort करता है
- कीबोर्ड डिवाइस खोलने के लिए एक सरल keylogger लिखा गया।
htop चल रहा हो या नहीं, गेम हमेशा बैकग्राउंड में चलता रहता है
समर्थित प्लेटफ़ॉर्म
- केवल Ubuntu 22.04 पर टेस्ट किया गया है
- WSL और Arch में कीबोर्ड डिवाइस का नाम अलग है। पोर्टिंग की आवश्यकता है
समस्या समाधान
- अगर कीबोर्ड काम नहीं करता
main.c में KEYBOARD_DEVICE macro जाँचें। यह प्लेटफ़ॉर्म के अनुसार अलग हो सकता है
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 प्रोसेस मर जाए और केवल zombie processes बचें
sudo pkill doom-htop चलाएँ
सुधार के बिंदु
- arrow keys से चलते समय
htop स्क्रीन भी हिलती है, जिससे असुविधा होती है
htop शुरू होने के बाद focus बदलकर इसे हल किया जा सकता है (जैसे a key दबाकर processor selection menu खोलना)
FAQ
- Q: इसे क्यों बनाया गया?
A: क्योंकि यह मज़ेदार लगा।
लाइसेंस
- Freedoom BSD-style license के अंतर्गत है (
freedoom-license.txt देखें)
- बाकी कोड संभवतः GPL है
GN⁺ की राय
- ASCII art से 3D गेम स्क्रीन दिखाना एक ताज़ा आइडिया है। यह C में htop जैसी स्क्रीन पर ग्राफ़िक्स बनाने का अच्छा उदाहरण लगता है
- केवल स्क्रीन को ASCII art में बदलना ही नहीं, बल्कि इसे वास्तविक गेम इंजन के साथ जोड़कर इम्प्लीमेंट किया गया है, यह प्रभावशाली है
- मौजूदा
doomgeneric प्रोजेक्ट का अच्छा उपयोग करके कम कोड में इसे बनाया गया है, यह भी सराहनीय है
- कीबोर्ड इनपुट लेने के लिए Linux डिवाइस को सीधे खोलना WSL या अन्य OS वातावरण में काम न भी करे। OS-स्वतंत्र key input library पर विचार किया जा सकता है
- shared memory का उपयोग करके parent-child processes के बीच ASCII frame data भेजने का विचार दिलचस्प है। IPC सीखने के लिए यह अच्छा उदाहरण है
htop के प्रोसेस नामों में ASCII graphics डालने का विचार भी रचनात्मक है। लेकिन प्रोसेस नाम बदलने से स्क्रीन हिलने जैसे side effects भी हैं। इसमें सुधार की ज़रूरत लगती है
- लाइसेंस संभवतः GPL है, लेकिन स्पष्ट नहीं है। कोड reuse करते समय लाइसेंस की पुष्टि करना आवश्यक है
1 टिप्पणियां
Hacker News राय
ये टिप्पणियाँ उस प्रोजेक्ट पर प्रतिक्रियाएँ हैं जिसमें htop का उपयोग करके ASCII में render किया गया Doom गेम एक process के रूप में चलाया जाता है। मुख्य बिंदु इस प्रकार हैं: