(Anda mungkin ingin tahu tentang istilah "tambalan monyet" atau "meninju bebek" jika tidak lain dari citra mental lucu.)
Selain itu: jika tujuan Anda adalah mengurangi waktu iterasi untuk perubahan "perilaku", cobalah beberapa pendekatan yang membuat Anda hampir sampai di sana, dan gabungkan dengan baik untuk mengaktifkan lebih banyak hal ini di masa depan.
(Ini akan keluar dengan sedikit singgung, tapi aku berjanji itu akan kembali!)
- Mulailah dengan data , dan mulai dari yang kecil: muat ulang pada batas ("level" atau sejenisnya), kemudian lanjutkan dengan menggunakan fungsionalitas OS untuk mendapatkan pemberitahuan perubahan file atau cukup jajak pendapat secara teratur.
- (Untuk poin bonus dan waktu muat yang lebih rendah (sekali lagi, kurangi waktu iterasi) lihat ke pembuatan data .)
- Script adalah data , dan memungkinkan Anda untuk mengulangi perilaku. Jika Anda menggunakan bahasa skrip, Anda sekarang memiliki notifikasi / kemampuan untuk memuat ulang skrip tersebut, ditafsirkan atau dikompilasi. Anda juga dapat menghubungkan juru bahasa Anda ke konsol dalam game, soket jaringan, atau sejenisnya untuk meningkatkan fleksibilitas runtime.
- Kode juga dapat berupa data : kompiler Anda dapat mendukung overlay , pustaka bersama, DLL, atau sejenisnya. Jadi sekarang Anda dapat memilih waktu "aman" untuk membongkar dan memuat ulang overlay atau DLL, apakah manual atau otomatis. Jawaban lain masuk ke detail di sini. Perhatikan bahwa beberapa varian ini dapat mengacaukan verifikasi tanda tangan kriptografis, bit NX (tidak ada eksekusi) , atau mekanisme keamanan serupa.
- Pertimbangkan sistem simpan / muat yang dalam dan berversi . Jika Anda dapat menyimpan dan memulihkan negara Anda dengan mantap bahkan dalam menghadapi perubahan kode, Anda dapat mematikan game Anda dan memulai kembali dengan logika baru pada titik yang sama persis. Lebih mudah diucapkan daripada dilakukan, tetapi itu bisa dilakukan, dan itu jauh lebih mudah dan lebih portabel daripada memencet memori untuk mengubah instruksi.
- Bergantung pada struktur dan determinisme permainan Anda, Anda mungkin dapat melakukan perekaman dan pemutaran . Jika rekaman itu lebih dari "perintah permainan" (pikirkan permainan kartu, misalnya), Anda dapat mengubah semua kode render yang Anda inginkan, dan memutar ulang rekaman untuk melihat perubahan Anda. Untuk beberapa game, ini "semudah" merekam beberapa parameter awal (mis. Seed acak) dan kemudian aksi pengguna. Bagi sebagian orang itu jauh lebih rumit.
- Berusaha untuk mengurangi waktu kompilasi . Dalam kombinasi dengan sistem save / load atau record / playback yang disebutkan di atas, atau bahkan dengan overlay atau DLL, ini dapat mengurangi turnaround Anda lebih dari hal lainnya.
Banyak dari poin-poin ini bermanfaat bahkan jika Anda tidak mendapatkan semua cara untuk memuat ulang data atau kode.
Anekdot pendukung:
Pada PC RTS besar (~ 120 orang tim, kebanyakan C ++), ada sistem penghematan yang sangat dalam, yang digunakan untuk setidaknya tiga tujuan:
- Simpan "dangkal" diumpankan tidak ke disk tetapi ke mesin CRC untuk memastikan bahwa permainan multi pemain tetap dalam simulasi langkah-kunci satu CRC setiap 10-30 frame; ini memastikan tidak ada yang curang dan menangkap bug desync beberapa frame kemudian
- Jika dan ketika bug desync multipemain terjadi, save ekstra-dalam dilakukan setiap frame, dan sekali lagi diumpankan ke engine CRC, tetapi kali ini engine CRC akan menghasilkan banyak CRC, masing-masing untuk batch byte yang lebih kecil. Dengan cara ini, ia bisa memberi tahu Anda dengan tepat bagian mana dari negara yang mulai menyimpang dalam bingkai terakhir. Kami menangkap perbedaan "default floating point mode" yang buruk antara AMD dan Intel menggunakan ini.
- Penyelamatan kedalaman normal mungkin tidak menyimpan misalnya kerangka animasi unit Anda sedang diputar, tetapi ia akan mendapatkan posisi, kesehatan, dll dari semua unit Anda, memungkinkan Anda untuk menyimpan dan melanjutkan kapan saja selama bermain game.
Sejak itu saya menggunakan rekam deterministik / pemutaran pada permainan kartu C ++ dan Lua untuk DS. Kami terhubung ke API yang kami desain untuk AI (di sisi C ++) dan mencatat semua tindakan pengguna dan AI. Kami menggunakan fungsi ini dalam game (untuk memberikan replay untuk pemain), tetapi juga untuk mendiagnosis masalah: ketika ada kerusakan atau perilaku aneh, yang harus kami lakukan adalah mendapatkan file save dan memutarnya kembali dalam bentuk debug.
Saya juga telah menggunakan overlay lebih dari beberapa kali, dan kami menggabungkannya dengan "secara otomatis spider direktori ini dan mengunggah konten baru ke sistem handheld". Yang harus kita lakukan adalah meninggalkan cutscene / level / apa pun dan kembali lagi, dan tidak hanya data baru (sprite, tata letak level, dll) yang akan dimuat tetapi juga kode baru apa pun dalam overlay. Sayangnya itu semakin sulit dengan handheld yang lebih baru karena perlindungan terhadap penyalinan dan mekanisme anti-peretasan yang memperlakukan kode secara khusus. Kami masih melakukannya untuk skrip lua.
Last but not least: Anda dapat (dan saya punya, dalam berbagai keadaan spesifik yang sangat kecil) melakukan sedikit bebek meninju dengan menambal kode instruksi secara langsung. Ini berfungsi paling baik jika Anda menggunakan platform dan kompiler tetap, dan karena ini hampir tidak dapat dipelihara, sangat rentan terhadap bug, dan terbatas pada apa yang dapat Anda capai dengan cepat, saya kebanyakan hanya menggunakannya untuk merutekan ulang kode saat debugging. Ini tidak mengajarkan neraka banyak tentang arsitektur set instruksi Anda terburu-buru, meskipun.