Zig में लिखा गया Game Boy Advance गेम
(jonot.me)Zig में Game Boy Advance गेम क्यों लिखा गया
-
Game Boy Advance का आकर्षण
Game Boy Advance में एक आधुनिक CPU (32-bit ARM, बहुत सारे registers) है, लेकिन यह एक पुराने tile-based renderer का उपयोग करता है। यह NES द्वारा 80 के दशक में इस्तेमाल किए गए तरीके जैसा है। Nintendo के आखिरी tile-based systems में से एक होने के नाते, यह affine transforms, transparency, sprite effects जैसी कई सुविधाएँ देता है. -
Zig भाषा चुनने की वजह
शुरुआत में Game Boy Advance प्रोजेक्ट C++ में शुरू किया गया था, लेकिन पहला पूरा गेम Zig में लिखा गया। Zig अभी भी beta version में है, और Game Boy Advance के रिलीज़ होने के 15 साल बाद बनी भाषा होने के बावजूद, यह embedded programming के लिए उपयुक्त features देती है.
Toolchain
-
Linux और devKitPro
Linux का उपयोग करते हुए package management की कठिनाइयों का सामना करना पड़ा, और Nintendo DS के लिए 3D scene बनाते समय devKitPro का उपयोग करना पड़ा। इसमें GCC toolchain, libraries, और development tools शामिल हैं। इसे ArchLinux package manager के जरिए install करना पड़ता है, जो थोड़ा झंझट वाला है. -
Zig के फायदे
Zig cross-compilation को आसान बनाता है, और किसी जटिल package manager को सेट up करने की ज़रूरत नहीं होती। Zig का build systembuild.zigफ़ाइल मेंbuildfunction को चलाकर build करता है। इससे build process सरल हो जाता है और errors कम होते हैं.
Packed Structs
- Packed Structs का महत्व
Game Boy Advance किसी high-level API call के बिना registers के जरिए hardware को control करता है। Zig के packed struct memory layout को optimize करते हैं, जिससे hardware control आसान हो जाता है। यह Game Boy Advance programming के लिए बहुत उपयोगी feature है.
Comptime
- Compile time पर code execution
Zig compile time पर code चलाने की सुविधा देता है। इससे data को runtime पर compress करने के बजाय compile time पर compress किया जा सकता है। Zig का यह feature data compression को आसान बनाता है.
Standard Library
- Zig की flexible standard library
Zig की standard library generics को support करती है, और memory allocation functions में allocator को argument के रूप में लिया जा सकता है। इससे custom memory allocation methods का उपयोग किया जा सकता है। Zig की standard library hardware constraints वाले environments में भी लचीले ढंग से इस्तेमाल की जा सकती है.
समस्याएँ
-
Inline assembly
Zig inline assembly को support करता है, लेकिन केवल एक output संभव है। यह तब समस्या बनता है जब GBA के BIOS functions में कई values output करनी हों. -
Thumb code / ARM code
Game Boy Advance का CPU ARM mode और Thumb mode दोनों को support करता है। Zig में ARM और Thumb modes को स्पष्ट रूप से निर्दिष्ट नहीं किया जा सकता. -
अजीब memory
Game Boy Advance की video memory में 8-bit units में write नहीं किया जा सकता, जिससे graphics बिगड़ सकते हैं। Zig memory copy के समय optimization के लिएmemcpyका उपयोग करता है, लेकिन यह GBA की "अजीब memory" के साथ टकरा सकता है.
1 टिप्पणियां
Hacker News टिप्पणियाँ
volatileइस्तेमाल करने पर भी समस्या हल नहीं होती, तो compiler bug report करने की सलाह दी गई हैmemcpyसे बदल देता है। उम्मीद थी कि यह optimization सिर्फ user space में होगी, और-nostdliboption से इसे अपने-आप संभाला जा सकेगा