मैंने अपने गेम इंजन के लिए कोरुटीन बनाए, फिर उनका उपयोग नहीं किया

मैंने अपने गेम इंजन के लिए एक जनरेटर कोरुटीन सिस्टम (generator coroutine system) बनाया। इसमें 122 लाइन का कोड और 12 टेस्ट थे। इसने 'कॉलबैक हेल' (callback hell) की समस्या को हल कर दिया। इसने स्क्रिप्ट्स को सीधी रेखाओं की तरह दिखने में मदद की।

फिर मैंने इसे अपने गेम लॉजिक के लिए उपयोग न करने का फैसला किया। इसके बजाय, मैंने एक फाइनाइट स्टेट मशीन (Finite State Machine - FSM) का उपयोग किया।

इसका कारण यहाँ दिया गया है।

अधिकांश ट्यूटोरियल रियल-टाइम गेम्स में जनरेटर्स के साथ होने वाली दो बड़ी समस्याओं को नज़रअंदाज़ कर देते हैं: मेमोरी और सेविंग (saving)।

1. मेमोरी प्रेशर (Memory Pressure)

हर बार जब आप किसी जनरेटर पर .next() कॉल करते हैं, तो जावास्क्रिप्ट इंजन एक नया ऑब्जेक्ट बनाता है। इस ऑब्जेक्ट में वर्तमान वैल्यू और स्टेटस (status) होता है।

60 FPS पर चलने वाले गेम लूप में, यह लगातार 'गारबेज कलेक्शन' (garbage collection) का दबाव पैदा करता है। मेरा इंजन परफॉरमेंस को स्थिर रखने के लिए 'ज़ीरो-एलोकेशन' (zero-allocation) नियम का पालन करता है। जनरेटर्स उस नियम को तोड़ते हैं। वे हर एक फ्रेम में छोटे ऑब्जेक्ट्स की एक स्ट्रीम बना देते हैं।

2. सीरियलाइजेशन की समस्या (The Serialization Problem)

एक गेम को सेव और लोड करने की आवश्यकता होती है। आपको वर्तमान गेम स्टेट को डेटा में बदलना होता है और फिर वापस लाना होता है।

आप एक रुके हुए (paused) जनरेटर को सीरियलाइज़ (serialize) नहीं कर सकते। इसकी स्टेट इंजन के उन इंटरनल स्लॉट्स में रहती है जिन्हें आप एक्सेस नहीं कर सकते। यदि आप इसे सेव करने की कोशिश करते हैं, तो आपको एक खाली ऑब्जेक्ट या एरर मिलेगा।

एक फाइनाइट स्टेट मशीन (FSM) अलग होती है। इसकी स्टेट बस एक कंपोनेंट पर एक स्ट्रिंग (string) होती है।

  • सेव करने के लिए: स्ट्रिंग को डिस्क पर लिखें।
  • लोड करने के लिए: स्ट्रिंग को पढ़ें और FSM को वहीं से शुरू करने के लिए कहें।

FSM इसलिए जीत गया क्योंकि यह उन दो चीजों को संभालता है जो एक प्रोफेशनल गेम के लिए महत्वपूर्ण हैं: परफॉरमेंस और पर्सिस्टेंस (persistence)।

कैसे चुनें:

क्या लॉजिक मुख्य फ्रेम लूप (main frame loop) के अंदर है?

  • नहीं: जनरेटर कोरुटीन का उपयोग करें। वे एसेट्स लोड करने या ऑनबोर्डिंग जैसे वन-टाइम फ्लो के लिए बेहतरीन हैं।
  • हाँ: अगला प्रश्न पूछें।

क्या स्टेट को सेव के बाद भी बने रहने की आवश्यकता है?

  • हाँ: फाइनाइट स्टेट मशीन का उपयोग करें।
  • नहीं: अगला प्रश्न पूछें।

क्या आप एक साथ कई सीक्वेंस चला रहे हैं?

  • हाँ: फाइनाइट स्टेट मशीन का उपयोग करें।
  • नहीं: जनरेटर कोरुटीन का उपयोग करें।

जनरेटर्स कोई गलती नहीं हैं। वे बस 'हॉट पाथ' (hot path) के लिए गलत टूल हैं। उनका उपयोग 'एसिंक ग्लू' (async glue) के लिए करें, लेकिन अपने गेम लॉजिक के लिए FSM का उपयोग करें।

स्रोत: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g