मी माझ्या गेम इंजिनसाठी कोरुटीन्स (Coroutines) बनवले, पण नंतर त्यांचा वापर केला नाही
मी माझ्या गेम इंजिनसाठी एक जनरेटर कोरुटीन (generator coroutine) सिस्टम तयार केली. त्यात १२२ ओळींचा कोड आणि १२ टेस्ट्स होत्या. त्याने 'कॉलबॅक हेल' (callback hell) ची समस्या सोडवली. त्यामुळे स्क्रिप्ट्स सरळ रेषेसारख्या (straight lines) दिसू लागल्या.
त्यानंतर मी माझ्या गेम लॉजिकसाठी त्याचा वापर न करण्याचा निर्णय घेतला. त्याऐवजी मी फाईनाईट स्टेट मशीन (Finite State Machine - FSM) वापरले.
त्याचे कारण खालीलप्रमाणे आहे.
बहुतेक ट्युटोरियल्स रिअल-टाइम गेम्समधील जनरेटर्सच्या दोन मोठ्या समस्यांकडे दुर्लक्ष करतात: मेमरी (memory) आणि सेव्हिंग (saving).
१. मेमरी प्रेशर (Memory Pressure)
जेव्हा तुम्ही जनरेटरवर .next() कॉल करता, तेव्हा प्रत्येक वेळी JavaScript इंजिन एक नवीन ऑब्जेक्ट तयार करते. या ऑब्जेक्टमध्ये सध्याची व्हॅल्यू (value) आणि स्टेटस (status) असते.
६० FPS वर चालणाऱ्या गेम लूपमध्ये, यामुळे सतत 'गारबेज कलेक्शन' (garbage collection) प्रेशर निर्माण होते. परफॉर्मन्स स्थिर ठेवण्यासाठी माझे इंजिन 'झिरो-अलोकेशन' (zero-allocation) नियमाचे पालन करते. जनरेटर्स हा नियम मोडतात. ते प्रत्येक फ्रेममध्ये लहान ऑब्जेक्ट्सची एक स्ट्रीम तयार करतात.
२. सिरियलायझेशनची समस्या (The Serialization Problem) गेमला सेव्ह आणि लोड करण्याची गरज असते. तुम्हाला सध्याची गेम स्टेट डेटा मध्ये आणि पुन्हा डेटा मधून स्टेट मध्ये रूपांतरित करावी लागते.
तुम्ही पॉज केलेल्या (paused) जनरेटरचे सिरियलायझेशन करू शकत नाही. त्याची स्टेट इंजिनच्या अशा अंतर्गत स्लॉट्समध्ये असते ज्यामध्ये तुम्ही प्रवेश करू शकत नाही. जर तुम्ही ते सेव्ह करण्याचा प्रयत्न केला, तर तुम्हाला एक रिकामे ऑब्जेक्ट किंवा एरर मिळेल.
फाईनाईट स्टेट मशीन (FSM) वेगळे आहे. यामध्ये स्टेट म्हणजे केवळ एका कंपोनंटवरील एक स्ट्रिंग (string) असते.
- सेव्ह करण्यासाठी: स्ट्रिंग डिस्कवर लिहा.
- लोड करण्यासाठी: स्ट्रिंग वाचा आणि FSM ला तिथून सुरू करण्यास सांगा.
FSM चा विजय झाला कारण ते प्रोफेशनल गेमसाठी महत्त्वाच्या असलेल्या दोन गोष्टी हाताळते: परफॉर्मन्स (performance) आणि पर्सिस्टन्स (persistence).
कसे निवडावे:
लॉजिक मुख्य फ्रेम लूपच्या (main frame loop) आत आहे का?
- नाही: जनरेटर कोरुटीन वापरा. ॲसेट्स लोड करणे किंवा ऑनबोर्डिंग (onboarding) सारख्या वन-टाइम फ्लोसाठी ते उत्तम आहेत.
- हो: पुढचा प्रश्न विचारा.
स्टेटला सेव्ह केल्यानंतरही टिकून राहण्याची गरज आहे का?
- हो: फाईनाईट स्टेट मशीन वापरा.
- नाही: पुढचा प्रश्न विचारा.
तुम्ही एकाच वेळी अनेक सीक्वेन्स (sequences) चालवत आहात का?
- हो: फाईनाईट स्टेट मशीन वापरा.
- नाही: जनरेटर कोरुटीन वापरा.
जनरेटर्स ही चूक नाही. ते फक्त 'हॉट पाथ' (hot path) साठी चुकीचे साधन आहेत. त्यांचा वापर 'असिंक ग्लू' (async glue) साठी करा, परंतु तुमच्या गेम लॉजिकसाठी FSM वापरा.
स्त्रोत: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g
