Waktu iterasi yang cepat adalah kunci untuk mengembangkan game, jauh lebih daripada grafis yang bagus dan mesin dengan truk penuh fitur menurut saya. Tidak heran banyak pengembang kecil memilih bahasa scripting.
Cara Unity 3D untuk dapat menjeda permainan dan memodifikasi aset DAN kode, kemudian melanjutkan dan membuat perubahan segera berlaku sangat bagus untuk ini. Pertanyaan saya adalah, adakah yang menerapkan sistem serupa pada mesin game C ++?
Saya telah mendengar bahwa beberapa mesin kelas atas benar-benar bagus, tetapi saya lebih tertarik untuk mencari tahu apakah ada cara untuk melakukannya di mesin atau permainan buatan sendiri.
Jelas akan ada pengorbanan, dan saya tidak bisa membayangkan bahwa Anda bisa mengkompilasi ulang kode Anda saat permainan dijeda, minta dimuat ulang dan bekerja di bawah setiap keadaan atau setiap platform.
Tapi mungkin itu mungkin untuk pemrograman AI dan modul logika level sederhana. Bukannya saya ingin melakukan itu dalam proyek apa pun dalam jangka pendek (atau jangka panjang), tetapi saya ingin tahu.
sumber
Hot-swapping adalah masalah yang sangat, sangat sulit untuk dipecahkan dengan kode biner. Bahkan jika kode Anda ditempatkan di pustaka tautan dinamis yang terpisah, kode Anda perlu memastikan bahwa tidak ada referensi langsung ke fungsi dalam memori (karena alamat fungsi dapat berubah dengan kompilasi ulang). Ini pada dasarnya berarti tidak menggunakan fungsi virtual, dan apa pun yang menggunakan pointer fungsi melakukannya melalui semacam tabel pengiriman.
Hal-hal berbulu, membatasi. Lebih baik menggunakan bahasa scripting untuk kode yang membutuhkan iterasi cepat.
Di tempat kerja, basis kode kami saat ini adalah campuran dari C ++ dan Lua. Lua juga bukan bagian kecil dari proyek kami - hampir separuh 50/50. Kami telah menerapkan pemuatan ulang Lua dengan cepat, sehingga Anda dapat mengubah baris kode, memuat ulang, dan terus melanjutkan. Bahkan, Anda dapat melakukan ini untuk memperbaiki bug kerusakan yang terjadi dalam kode Lua, tanpa memulai ulang game!
sumber
(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!)
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:
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.
sumber
Anda dapat melakukan sesuatu seperti hot-swapping modules pada saat runtime mengimplementasikan modul sebagai pustaka tautan dinamis (atau pustaka bersama di UNIX), dan menggunakan dlopen () dan dlsym () untuk memuat fungsi secara dinamik dari pustaka.
Untuk Windows, padanannya adalah LoadLibrary dan GetProcAddress.
Ini adalah metode C, dan memiliki beberapa kesulitan dengan menggunakannya dalam C ++, Anda dapat membaca tentang itu di sini .
sumber
Jika Anda menggunakan Visual Studio C ++ Anda sebenarnya dapat menghentikan sebentar dan mengkompilasi ulang kode Anda dalam keadaan tertentu. Visual Studio mendukung Edit dan Lanjutkan . Lampirkan permainan Anda di debugger, buat berhenti di breakpoint, dan kemudian modifikasi kode setelah breakpoint Anda. Jika Anda ingin menyimpan dan kemudian melanjutkan, Visual Studio akan mencoba untuk mengkompilasi ulang kode, masukkan kembali ke dalam eksekusi yang dapat dijalankan, dan lanjutkan. Jika semuanya berjalan dengan baik, perubahan yang Anda buat akan langsung diterapkan ke permainan yang sedang berjalan tanpa harus melakukan seluruh siklus pengujian pembuatan kompilasi. Namun, hal berikut ini akan menghentikan ini berfungsi:
Saya telah menggunakan Edit dan Lanjutkan untuk secara dramatis meningkatkan kecepatan hal-hal seperti iterasi UI. Katakanlah Anda memiliki UI yang berfungsi sepenuhnya dibangun dalam kode kecuali bahwa Anda secara tidak sengaja menukar urutan dua kotak sehingga Anda tidak dapat melihat apa pun. Dengan mengubah 2 baris kode secara langsung, Anda dapat menyimpan sendiri siklus kompilasi / bangun / pengujian 20 menit untuk memeriksa perbaikan UI yang sepele.
Ini BUKAN solusi lengkap untuk lingkungan produksi, dan saya telah menemukan solusi terbaik untuk memindahkan sebanyak mungkin logika Anda ke dalam file data dan kemudian membuat file data tersebut dimuat ulang.
sumber
Seperti yang orang lain katakan, ini adalah masalah yang sulit, menghubungkan secara dinamis C ++. Tetapi ini adalah masalah yang terpecahkan - Anda mungkin pernah mendengar tentang COM atau salah satu nama pemasaran yang telah diterapkan selama bertahun-tahun: ActiveX.
COM memiliki sedikit nama yang buruk dari sudut pandang pengembang karena dapat banyak upaya untuk mengimplementasikan komponen C ++ yang mengekspos fungsionalitasnya menggunakannya (meskipun ini dipermudah dengan ATL - pustaka template ActiveX). Dari sudut pandang konsumen ia memiliki nama yang buruk karena aplikasi yang menggunakannya, misalnya untuk menanamkan lembar kerja Excel dalam dokumen Word atau diagram Visio dalam lembar kerja Excel, cenderung macet cukup lama di hari itu. Dan itu bermuara pada masalah yang sama - bahkan dengan semua panduan yang ditawarkan Microsoft, COM / ActiveX / OLE sulit untuk diperbaiki.
Saya akan menekankan bahwa teknologi COM itu sendiri pada dasarnya tidak buruk. Pertama-tama, DirectX menggunakan antarmuka COM untuk mengekspos fungsionalitasnya dan itu bekerja dengan cukup baik, seperti halnya banyak aplikasi yang menanamkan Internet Explorer menggunakan kontrol ActiveX itu. Kedua, ini adalah salah satu cara paling sederhana untuk secara dinamis menghubungkan kode C ++ - antarmuka COM pada dasarnya hanya kelas virtual murni. Meskipun memiliki IDL seperti CORBA, Anda tidak dipaksa untuk menggunakannya, terutama jika antarmuka yang Anda tetapkan hanya digunakan dalam proyek Anda.
Jika Anda tidak menulis untuk Windows, jangan berpikir bahwa COM tidak layak dipertimbangkan. Mozilla menerapkannya kembali dalam basis kode mereka (digunakan di browser Firefox) karena mereka membutuhkan cara untuk komponen kode C ++ mereka.
sumber
Ada implementasi C ++ compile runtime untuk kode gameplay di sini . Juga, saya tahu setidaknya ada satu mesin game berpemilik yang melakukan hal yang sama. Ini rumit, tetapi bisa dilakukan.
sumber