నా గేమ్ ఇంజిన్ కోసం కోరూటిన్స్ (Coroutines) నిర్మించాను, కానీ వాటిని ఉపయోగించలేదు

నేను నా గేమ్ ఇంజిన్ కోసం ఒక జనరేటర్ కోరూటిన్ సిస్టమ్‌ను రూపొందించాను. ఇందులో 122 లైన్ల కోడ్ మరియు 12 టెస్ట్‌లు ఉన్నాయి. ఇది 'కాల్‌బ్యాక్ హెల్' (callback hell) సమస్యను పరిష్కరించింది. ఇది స్క్రిప్ట్‌లను సరళ రేఖల వలె కనిపించేలా చేసింది.

ఆ తర్వాత, నా గేమ్ లాజిక్ కోసం దానిని ఉపయోగించకూడదని నిర్ణయించుకున్నాను. దానికి బదులుగా నేను ఫైనైట్ స్టేట్ మెషిన్ (Finite State Machine - FSM) ఉపయోగించాను.

దానికి కారణం ఇక్కడ ఉంది.

రియల్-టైమ్ గేమ్‌లలో జనరేటర్లతో వచ్చే రెండు భారీ సమస్యలను చాలా ట్యుటోరియల్స్ విస్మరిస్తాయి: మెమరీ మరియు సేవింగ్.

  1. మెమరీ ప్రెజర్ (Memory Pressure) మీరు జనరేటర్‌పై ప్రతిసారీ .next()ని కాల్ చేసినప్పుడు, జావాస్క్రిప్ట్ ఇంజిన్ ఒక కొత్త ఆబ్జెక్ట్‌ను సృష్టిస్తుంది. ఈ ఆబ్జెక్ట్‌లో ప్రస్తుత విలువ మరియు స్థితి (status) ఉంటాయి.

60 FPS వద్ద నడుస్తున్న గేమ్ లూప్‌లో, ఇది నిరంతర గార్బేజ్ కలెక్షన్ (garbage collection) ప్రెజర్‌ను కలిగిస్తుంది. పనితీరు స్థిరంగా ఉండటానికి నా ఇంజిన్ 'జీరో-అలోకేషన్' (zero-allocation) నియమాన్ని అనుసరిస్తుంది. జనరేటర్లు ఆ నియమాన్ని ఉల్లంఘిస్తాయి. అవి ప్రతి ఫ్రేమ్‌లో చిన్న చిన్న ఆబ్జెక్ట్‌ల ప్రవాహాన్ని సృష్టిస్తాయి.

  1. సీరియలైజేషన్ సమస్య (The Serialization Problem) ఒక గేమ్‌కు సేవ్ మరియు లోడ్ చేయాల్సిన అవసరం ఉంటుంది. మీరు ప్రస్తుత గేమ్ స్టేట్‌ను డేటాగా మార్చాలి మరియు తిరిగి దానిని పొందాలి.

మీరు నిలిపివేసిన (paused) జనరేటర్‌ను సీరియలైజ్ చేయలేరు. దాని స్థితి మీరు యాక్సెస్ చేయలేని అంతర్గత ఇంజిన్ స్లాట్‌లలో ఉంటుంది. మీరు దానిని సేవ్ చేయడానికి ప్రయత్నిస్తే, మీకు ఖాళీ ఆబ్జెక్ట్ లేదా ఎర్రర్ వస్తుంది.

ఫైనైట్ స్టేట్ మెషిన్ వేరుగా ఉంటుంది. ఇందులో స్టేట్ అనేది కేవలం ఒక కాంపోనెంట్‌లోని స్ట్రింగ్ (string) మాత్రమే.

  • సేవ్ చేయడానికి: ఆ స్ట్రింగ్‌ను డిస్క్‌లో రాయండి.
  • లోడ్ చేయడానికి: ఆ స్ట్రింగ్‌ను చదివి, FSM అక్కడి నుండి ప్రారంభించమని చెప్పండి.

ప్రొఫెషనల్ గేమ్‌కు ముఖ్యమైన రెండు అంశాలైన పనితీరు (performance) మరియు పర్సిస్టెన్స్ (persistence)ను FSM సమర్థవంతంగా నిర్వహిస్తుంది కాబట్టి అది విజయం సాధించింది.

ఎలా ఎంచుకోవాలి:

లాజిక్ మెయిన్ ఫ్రేమ్ లూప్‌లో ఉందా?

  • లేదు: జనరేటర్ కోరూటిన్‌ను ఉపయోగించండి. అసెట్స్ లోడ్ చేయడం లేదా ఆన్‌బోర్డింగ్ వంటి వన్-టైమ్ ఫ్లోస్ కోసం ఇవి అద్భుతంగా పనిచేస్తాయి.
  • అవును: తదుపరి ప్రశ్న అడగండి.

స్టేట్ సేవ్ చేసిన తర్వాత కూడా అలాగే ఉండాలా?

  • అవును: ఫైనైట్ స్టేట్ మెషిన్‌ను ఉపయోగించండి.
  • లేదు: తదుపరి ప్రశ్న అడగండి.

మీరు ఒకేసారి అనేక సీక్వెన్స్‌లను నడుపుతున్నారా?

  • అవును: ఫైనైట్ స్టేట్ మెషిన్‌ను ఉపయోగించండి.
  • లేదు: జనరేటర్ కోరూటిన్‌ను ఉపయోగించండి.

జనరేటర్లు తప్పు కాదు. అవి కేవలం 'హాట్ పాత్' (hot path) కోసం తగని సాధనాలు మాత్రమే. వాటిని async glue కోసం ఉపయోగించండి, కానీ మీ గేమ్ లాజిక్ కోసం FSMలను ఉపయోగించండి.

మూలం: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g