Saya Membangun Coroutine untuk Game Engine Saya, Lalu Tidak Menggunakannya
Saya membangun sistem coroutine generator untuk game engine saya. Sistem ini terdiri dari 122 baris kode dan 12 pengujian. Ia memecahkan masalah callback hell. Ia membuat skrip terlihat seperti garis lurus.
Kemudian saya memilih untuk tidak menggunakannya untuk logika game saya. Sebagai gantinya, saya menggunakan Finite State Machine (FSM).
Berikut alasannya.
Sebagian besar tutorial mengabaikan dua masalah besar pada generator dalam game real-time: memori dan penyimpanan (saving).
- Tekanan Memori
Setiap kali Anda memanggil
.next()pada sebuah generator, engine JavaScript membuat objek baru. Objek ini berisi nilai saat ini dan statusnya.
Dalam game loop yang berjalan pada 60 FPS, hal ini menciptakan tekanan garbage collection yang konstan. Engine saya mengikuti aturan zero-allocation untuk menjaga performa tetap stabil. Generator melanggar aturan tersebut. Mereka menciptakan aliran objek-objek kecil di setiap frame.
- Masalah Serialisasi Sebuah game perlu menyimpan (save) dan memuat (load). Anda perlu mengubah status game saat ini menjadi data dan sebaliknya.
Anda tidak dapat menserialisasi generator yang sedang dijeda (paused). Statusnya berada di slot internal engine yang tidak dapat Anda akses. Jika Anda mencoba menyimpannya, Anda akan mendapatkan objek kosong atau error.
Finite State Machine berbeda. Statusnya hanyalah sebuah string pada sebuah komponen.
- Untuk menyimpan: Tulis string tersebut ke disk.
- Untuk memuat: Baca string tersebut dan beri tahu FSM untuk mulai dari sana.
FSM menang karena ia menangani dua hal yang penting bagi game profesional: performa dan persistensi.
Cara memilih:
Apakah logikanya berada di dalam main frame loop?
- Tidak: Gunakan generator coroutine. Ini sangat bagus untuk alur satu kali seperti memuat aset atau onboarding.
- Ya: Ajukan pertanyaan berikutnya.
Apakah statusnya perlu bertahan setelah proses simpan (save)?
- Ya: Gunakan Finite State Machine.
- Tidak: Ajukan pertanyaan berikutnya.
Apakah Anda menjalankan banyak urutan sekaligus?
- Ya: Gunakan Finite State Machine.
- Tidak: Gunakan generator coroutine.
Generator bukanlah sebuah kesalahan. Mereka hanyalah alat yang salah untuk hot path. Gunakan mereka sebagai penghubung async, tetapi gunakan FSM untuk logika game Anda.
Sumber: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g
