میں نے اپنے گیم انجن کے لیے Coroutines بنائیں، پھر انہیں استعمال نہیں کیا
میں نے اپنے گیم انجن کے لیے ایک generator coroutine سسٹم بنایا۔ اس میں کوڈ کی 122 لائنیں اور 12 ٹیسٹ تھے۔ اس نے callback hell کے مسئلے کو حل کر دیا۔ اس نے اسکرپٹس کو سیدھی لائنوں کی طرح دکھایا۔
پھر میں نے اسے اپنے گیم لاجک کے لیے استعمال نہ کرنے کا فیصلہ کیا۔ اس کے بجائے میں نے Finite State Machine (FSM) کا استعمال کیا۔
اس کی وجہ یہ ہے۔
زیادہ تر ٹیوٹوریلز ریئل ٹائم گیمز میں generators کے ساتھ دو بڑے مسائل کو نظر انداز کر دیتے ہیں: میموری اور سیونگ (saving)۔
1. میموری کا دباؤ (Memory Pressure)
جب بھی آپ کسی generator پر .next() کال کرتے ہیں، تو JavaScript انجن ایک نیا آبجیکٹ (object) بناتا ہے۔ اس آبجیکٹ میں موجودہ ویلیو اور اسٹیٹس شامل ہوتے ہیں۔
60 FPS پر چلنے والے گیم لوپ میں، یہ مسلسل garbage collection کا دباؤ پیدا کرتا ہے۔ میرا انجن کارکردگی کو مستحکم رکھنے کے لیے zero-allocation کے اصول پر عمل کرتا ہے۔ Generators اس اصول کو توڑتے ہیں۔ وہ ہر فریم میں چھوٹے آبجیکٹس کا ایک سلسلہ (stream) پیدا کرتے ہیں۔
2. سیریلائزیشن (Serialization) کا مسئلہ
ایک گیم کو سیو (save) اور لوڈ (load) کرنے کی ضرورت ہوتی ہے۔ آپ کو گیم کی موجودہ حالت (state) کو ڈیٹا میں تبدیل کرنا پڑتا ہے اور پھر واپس۔
آپ ایک رکے ہوئے (paused) generator کو serialize نہیں کر سکتے۔ اس کی اسٹیٹ انجن کے اندرونی سلاٹس (slots) میں ہوتی ہے جن تک آپ کی رسائی نہیں ہوتی۔ اگر آپ اسے سیو کرنے کی کوشش کریں گے، تو آپ کو ایک خالی آبجیکٹ یا ایرر ملے گا۔
Finite State Machine مختلف ہے۔ اسٹیٹ محض ایک کمپوننٹ پر موجود ایک اسٹرنگ (string) ہوتی ہے۔
- سیو کرنے کے لیے: اسٹرنگ کو ڈسک پر لکھیں۔
- لوڈ کرنے کے لیے: اسٹرنگ کو پڑھیں اور FSM کو وہاں سے شروع کرنے کا کہیں۔
FSM اس لیے جیت گیا کیونکہ یہ ان دو چیزوں کو سنبھالتا ہے جو ایک پروفیشنل گیم کے لیے اہم ہیں: کارکردگی (performance) اور پائیداری (persistence)۔
کیسے منتخب کریں:
کیا لاجک مین فریم لوپ کے اندر ہے؟
- نہیں: generator coroutine استعمال کریں۔ یہ اثاثے (assets) لوڈ کرنے یا آن بورڈنگ (onboarding) جیسے ایک بار کے بہاؤ کے لیے بہترین ہیں۔
- جی ہاں: اگلا سوال پوچھیں۔
کیا اسٹیٹ کو سیو کے بعد برقرار رہنے کی ضرورت ہے؟
- جی ہاں: Finite State Machine استعمال کریں۔
- نہیں: اگلا سوال پوچھیں۔
کیا آپ ایک ساتھ بہت سے سیکوئنس (sequences) چلا رہے ہیں؟
- جی ہاں: Finite State Machine استعمال کریں۔
- نہیں: generator coroutine استعمال کریں۔
Generators کوئی غلطی نہیں ہیں۔ وہ بس "hot path" کے لیے غلط ٹول ہیں۔ انہیں async glue کے لیے استعمال کریں، لیکن اپنے گیم لاجک کے لیے FSMs استعمال کریں۔
Source: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g
