ਮੈਂ ਆਪਣੇ ਗੇਮ ਇੰਜਣ ਲਈ Coroutines ਬਣਾਏ, ਫਿਰ ਉਹਨਾਂ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ

ਮੈਂ ਆਪਣੇ ਗੇਮ ਇੰਜਣ ਲਈ ਇੱਕ generator coroutine ਸਿਸਟਮ ਬਣਾਇਆ। ਇਸ ਵਿੱਚ 122 ਲਾਈਨਾਂ ਦਾ ਕੋਡ ਅਤੇ 12 ਟੈਸਟ ਸਨ। ਇਸ ਨੇ callback hell ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ। ਇਸ ਨੇ ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਸਿੱਧੀਆਂ ਲਾਈਨਾਂ ਵਾਂਗ ਦਿਖਾਇਆ।

ਫਿਰ ਮੈਂ ਆਪਣੀ ਗੇਮ ਲੌਜਿਕ (game logic) ਲਈ ਇਸ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰਨ ਦਾ ਫੈਸਲਾ ਕੀਤਾ। ਇਸ ਦੀ ਬਜਾਏ ਮੈਂ ਇੱਕ Finite State Machine (FSM) ਦੀ ਵਰਤੋਂ ਕੀਤੀ।

ਇੱਥੇ ਇਸਦਾ ਕਾਰਨ ਦਿੱਤਾ ਗਿਆ ਹੈ।

ਜ਼ਿਆਦਾਤਰ ਟਿਊਟੋਰਿਅਲ ਰੀਅਲ-ਟਾਈਮ ਗੇਮਾਂ ਵਿੱਚ generators ਨਾਲ ਜੁੜੀਆਂ ਦੋ ਵੱਡੀਆਂ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰਦੇ ਹਨ: ਮੈਮੋਰੀ (memory) ਅਤੇ ਸੇਵਿੰਗ (saving)।

  1. Memory Pressure ਹਰ ਵਾਰ ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ generator 'ਤੇ .next() ਕਾਲ ਕਰਦੇ ਹੋ, ਤਾਂ JavaScript engine ਇੱਕ ਨਵਾਂ object ਬਣਾਉਂਦਾ ਹੈ। ਇਸ object ਵਿੱਚ ਮੌਜੂਦਾ ਮੁੱਲ (value) ਅਤੇ ਸਟੇਟਸ (status) ਹੁੰਦਾ ਹੈ।

60 FPS 'ਤੇ ਚੱਲ ਰਹੇ ਗੇਮ ਲੂਪ (game loop) ਵਿੱਚ, ਇਹ ਲਗਾਤਾਰ garbage collection ਦਾ ਦਬਾਅ ਪੈਦਾ ਕਰਦਾ ਹੈ। ਮੇਰਾ ਇੰਜਣ ਪਰਫਾਰਮੈਂਸ ਨੂੰ ਸਥਿਰ ਰੱਖਣ ਲਈ zero-allocation ਨਿਯਮ ਦੀ ਪਾਲਣਾ ਕਰਦਾ ਹੈ। Generators ਉਸ ਨਿਯਮ ਨੂੰ ਤੋੜਦੇ ਹਨ। ਉਹ ਹਰ ਫਰੇਮ ਵਿੱਚ ਛੋਟੇ objects ਦੀ ਇੱਕ ਲੜੀ (stream) ਬਣਾਉਂਦੇ ਹਨ।

  1. The Serialization Problem ਇੱਕ ਗੇਮ ਨੂੰ ਸੇਵ (save) ਅਤੇ ਲੋਡ (load) ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਤੁਹਾਨੂੰ ਮੌਜੂਦਾ ਗੇਮ ਸਟੇਟ (game state) ਨੂੰ ਡੇਟਾ ਵਿੱਚ ਅਤੇ ਦੁਬਾਰਾ ਵਾਪਸ ਬਦਲਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।

ਤੁਸੀਂ ਇੱਕ ਰੁਕੇ ਹੋਏ (paused) generator ਨੂੰ serialize ਨਹੀਂ ਕਰ ਸਕਦੇ। ਇਸਦੀ ਸਟੇਟ ਇੰਜਣ ਦੇ ਅੰਦਰੂਨੀ ਸਲੌਟਸ (internal engine slots) ਵਿੱਚ ਹੁੰਦੀ ਹੈ ਜਿਸ ਤੱਕ ਤੁਹਾਡੀ ਪਹੁੰਚ ਨਹੀਂ ਹੁੰਦੀ। ਜੇਕਰ ਤੁਸੀਂ ਇਸਨੂੰ ਸੇਵ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਇੱਕ ਖਾਲੀ object ਜਾਂ error ਮਿਲੇਗਾ।

ਇੱਕ Finite State Machine ਵੱਖਰੀ ਹੁੰਦੀ ਹੈ। ਸਟੇਟ ਸਿਰਫ਼ ਇੱਕ component 'ਤੇ ਇੱਕ string ਹੁੰਦੀ ਹੈ।

  • ਸੇਵ ਕਰਨ ਲਈ: string ਨੂੰ ਡਿਸਕ 'ਤੇ ਲਿਖੋ।
  • ਲੋਡ ਕਰਨ ਲਈ: string ਨੂੰ ਪੜ੍ਹੋ ਅਤੇ FSM ਨੂੰ ਉੱਥੋਂ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਕਹੋ।

FSM ਜਿੱਤ ਗਿਆ ਕਿਉਂਕਿ ਇਹ ਉਹਨਾਂ ਦੋ ਚੀਜ਼ਾਂ ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ ਜੋ ਇੱਕ ਪੇਸ਼ੇਵਰ ਗੇਮ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹਨ: performance ਅਤੇ persistence।

ਕਿਵੇਂ ਚੁਣਨਾ ਹੈ:

ਕੀ ਲੌਜਿਕ ਮੁੱਖ ਫਰੇਮ ਲੂਪ (main frame loop) ਦੇ ਅੰਦਰ ਹੈ?

  • ਨਹੀਂ: Generator coroutine ਦੀ ਵਰਤੋਂ ਕਰੋ। ਉਹ assets ਲੋਡ ਕਰਨ ਜਾਂ onboarding ਵਰਗੇ ਇੱਕ ਵਾਰ ਹੋਣ ਵਾਲੇ ਕੰਮਾਂ (one-time flows) ਲਈ ਵਧੀਆ ਹਨ।
  • ਹਾਂ: ਅਗਲਾ ਸਵਾਲ ਪੁੱਛੋ।

ਕੀ ਸਟੇਟ ਨੂੰ ਸੇਵ ਕਰਨ ਤੋਂ ਬਾਅਦ ਬਚਾਉਣ ਦੀ ਲੋੜ ਹੈ?

  • ਹਾਂ: Finite State Machine ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • ਨਹੀਂ: ਅਗਲਾ ਸਵਾਲ ਪੁੱਛੋ।

ਕੀ ਤੁਸੀਂ ਇੱਕੋ ਸਮੇਂ ਕਈ sequences ਚਲਾ ਰਹੇ ਹੋ?

  • ਹਾਂ: Finite State Machine ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • ਨਹੀਂ: Generator coroutine ਦੀ ਵਰਤੋਂ ਕਰੋ।

Generators ਕੋਈ ਗਲਤੀ ਨਹੀਂ ਹਨ। ਉਹ ਸਿਰਫ਼ hot path ਲਈ ਗਲਤ ਸੰਦ ਹਨ। ਉਹਨਾਂ ਦੀ ਵਰਤੋਂ async glue ਲਈ ਕਰੋ, ਪਰ ਆਪਣੀ ਗੇਮ ਲੌਜਿਕ ਲਈ FSMs ਦੀ ਵਰਤੋਂ ਕਰੋ।

ਸਰੋਤ: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g