Nilijenga Coroutines kwa ajili ya Game Engine Yangu, Kisha Nikaziepuka Kutumia

Nilijenga mfumo wa generator coroutine kwa ajili ya game engine yangu. Ulikuwa na mistari 122 ya kodi na majaribio 12. Ulitatua tatizo la 'callback hell'. Ulifanya skripti zionekane kama mistari iliyonyooka.

Kisha nikachagua kutoutumia kwa ajili ya mantiki ya mchezo wangu (game logic). Badala yake, nilitumia Finite State Machine (FSM).

Hapa kuna sababu.

Mafunzo mengi hupuuza matatizo mawili makubwa ya generators katika michezo ya wakati halisi (real-time games): kumbukumbu (memory) na kuhifadhi (saving).

1. Shinikizo la Kumbukumbu (Memory Pressure)

Kila unapoita .next() kwenye generator, injini ya JavaScript hutengeneza object mpya. Object hii ina thamani ya sasa na hali (status).

Katika mzunguko wa mchezo (game loop) unaofanya kazi kwa 60 FPS, hii inasababisha shinikizo la mara kwa mara la 'garbage collection'. Engine yangu inafuata sheria ya 'zero-allocation' ili kuweka utendaji (performance) ukiwa thabiti. Generators zinavunja sheria hiyo. Zinatengeneza mtiririko wa objects ndogo ndogo kila frame.

2. Tatizo la Serialization

Mchezo unahitaji kuhifadhi na kupakia (save and load). Unahitaji kubadilisha hali ya sasa ya mchezo kuwa data na kurejesha tena.

Huwezi ku-serialize generator iliyosimama (paused). Hali yake (state) ipo kwenye nafasi za ndani za injini (internal engine slots) ambazo huwezi kuzifikia. Ukijaribu kuihifadhi, unapata object tupu au hitilafu (error).

Finite State Machine ni tofauti. Hali (state) ni string tu kwenye component.

  • Ili kuhifadhi: Andika string hiyo kwenye diski.
  • Ili kupakia: Soma string hiyo na uiambie FSM ianze hapo.

FSM ilishinda kwa sababu inashughulikia mambo mawili muhimu kwa mchezo wa kitaalamu: utendaji (performance) na uendelevu (persistence).

Jinsi ya kuchagua:

Je, mantiki (logic) iko ndani ya mzunguko mkuu wa frame (main frame loop)?

  • Hapana: Tumia generator coroutine. Ni nzuri kwa mtiririko wa mara moja kama vile kupakia rasilimali (assets) au onboarding.
  • Ndiyo: Uliza swali linalofuata.

Je, hali (state) inahitaji kuendelea baada ya kuhifadhi?

  • Ndiyo: Tumia Finite State Machine.
  • Hapana: Uliza swali linalofuata.

Je, unaendesha mfuatano (sequences) mingi kwa wakati mmoja?

  • Ndiyo: Tumia Finite State Machine.
  • Hapana: Tumia generator coroutine.

Generators si kosa. Ni tu kifaa kisichofaa kwa 'hot path'. Zitumie kwa ajili ya 'async glue', lakini tumia FSM kwa ajili ya mantiki ya mchezo wako.

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