Saya bekerja pada mesin yang sama dengan coderanger. Saya memiliki sudut pandang yang berbeda. :)
Pertama, kami tidak memiliki setumpuk FSM - kami memiliki setumpuk status. Setumpuk negara membuat FSM tunggal. Saya tidak tahu akan seperti apa tumpukan FSM. Mungkin terlalu rumit untuk melakukan sesuatu yang praktis.
Masalah terbesar saya dengan Mesin Negara Global kami adalah bahwa itu adalah tumpukan negara, dan bukan satu set negara. Ini berarti, misalnya, ... / MainMenu / Memuat berbeda dari ... / Memuat / MainMenu, tergantung pada apakah Anda mendapatkan menu utama sebelum atau setelah layar pemuatan (permainan asinkron dan memuat sebagian besar didorong oleh server ).
Sebagai dua contoh hal ini menjadikannya jelek:
- Ini menyebabkan misalnya status LoadingGameplay, jadi Anda memiliki Base / Loading, dan Base / Gameplay / LoadingGameplay untuk memuat dalam keadaan Gameplay, yang harus mengulang banyak kode dalam keadaan loading normal (tetapi tidak semua, dan menambahkan lebih banyak lagi) ).
- Kami memiliki beberapa fungsi seperti "jika dalam pencipta karakter pergi ke gameplay; jika dalam gameplay pergi ke pilih karakter; jika dalam karakter pilih kembali untuk masuk", karena kami ingin menunjukkan jendela antarmuka yang sama di berbagai negara tetapi membuat Kembali / Maju tombol masih berfungsi.
Meskipun namanya, itu tidak terlalu "global". Sebagian besar sistem permainan internal tidak menggunakannya untuk melacak keadaan internal mereka, karena mereka tidak ingin keadaan mereka bercanda dengan sistem lain. Lainnya, misalnya sistem UI, dapat menggunakannya tetapi hanya untuk menyalin negara ke sistem negara setempat mereka sendiri. (Saya akan sangat berhati-hati terhadap sistem untuk negara UI. Keadaan UI bukan tumpukan, itu benar-benar DAG, dan mencoba untuk memaksa struktur lain di atasnya hanya akan membuat UI yang frustasi untuk digunakan.)
Apa yang baik untuk itu adalah mengisolasi tugas untuk mengintegrasikan kode dari pemrogram infrastruktur yang tidak tahu bagaimana alur permainan sebenarnya terstruktur, sehingga Anda bisa memberi tahu orang yang menulis patcher "masukkan kode Anda di Client_Patch_Update", dan orang yang menulis grafik memuat "masukkan kode Anda di Client_MapTransfer_OnEnter", dan kami dapat menukar logika tertentu tanpa masalah.
Pada proyek sampingan, saya lebih beruntung dengan set keadaan daripada tumpukan , tidak takut untuk membuat beberapa mesin untuk sistem yang tidak terkait, dan menolak untuk membiarkan diri saya jatuh ke dalam perangkap memiliki "negara global", yang sebenarnya hanya cara rumit untuk menyinkronkan hal-hal melalui variabel global - Tentu, Anda akhirnya akan melakukannya di dekat tenggat waktu, tetapi jangan merancang dengan itu sebagai tujuan Anda . Pada dasarnya, status dalam game bukan tumpukan, dan status dalam game tidak semuanya terkait.
GSM juga, seperti fungsi pointer dan perilaku non-lokal cenderung, membuat hal-hal debugging lebih sulit, meskipun debug semacam transisi negara besar itu tidak terlalu menyenangkan sebelum kita memilikinya juga. Set negara bukannya tumpukan negara tidak benar-benar membantu ini, tetapi Anda harus menyadarinya. Fungsi virtual daripada fungsi pointer dapat mengurangi itu.