Kontrol versi dengan pengembangan game - Kapan saya harus bercabang?


26

Saya baru-baru ini mulai menggunakan Kontrol Versi dengan proyek saya (meskipun saya sedang mengerjakannya sendiri). Saya menemukan bahwa ini memberikan cara yang bagus untuk menyimpan sejarah seluruh proses pengembangan (dengan pelacakan masalah) dan memungkinkan saya untuk menyimpan cadangan untuk proyek-proyek saya di sepanjang jalan.

Ketika saya perlahan-lahan menemukan fitur dan keuntungan menggunakan kontrol versi, saya terjebak di sekitar gagasan percabangan. Kapan saya harus melakukannya?

Haruskah setiap kali saya pergi dan mengembangkan fitur baru, atau hanya sesekali ketika saya mencapai tonggak tertentu?

Jelas, bercabang sangat tidak berguna ketika bekerja sendirian, tetapi saya lebih suka mengambil kebiasaan baik sekarang dan terbiasa dengan itu.

Ketika saya membaca buku Game Coding Lengkap oleh Mike McShaffry (yang merupakan buku yang bagus), saya benar-benar tersesat ketika penulis merekomendasikan untuk menjaga tiga cabang, sesuatu di sepanjang baris:

  • Utama : Cabang pengembangan utama tempat perubahan reguler dilakukan.
  • Emas : Cabang emas tempat tonggak pencapaian terakhir disimpan.
  • Penelitian : Cabang untuk menguji hal-hal yang dapat berdampak buruk pada cabang Utama (memodifikasi komponen penting dari mesin permainan, dll.).

Begitukah seharusnya? Bagaimana cara kerjanya di dunia pengembangan game dengan tim pengembang besar?

Pada dasarnya: Kapan seseorang biasanya bercabang (dan bergabung) dalam pengembangan game?

Jawaban:


32

Percabangan sedikit tergantung pada dukungan VCS untuk fitur (yaitu: apakah VCS membuatnya mudah atau sulit).

Tetapi minimal, Anda menginginkan cabang untuk setiap rilis proyek Anda yang didukung secara independen. Artinya, jika Anda memiliki "Game 2", dan "Game 2 + Ekspansi" yang merupakan produk terpisah yang dibangun dari basis kode yang sama, dan Anda harus dapat menambal dan mengeluarkan pembaruan, maka Anda ingin memiliki masing-masing ada di cabang mereka sendiri dari basis kode utama, sehingga perbaikan ke basis kode inti dapat digabungkan ke dalam masing-masing produk ini secara independen. (Biasanya, cabang-cabang ini dibuat ketika setiap produk dirilis, atau mungkin beberapa hari / minggu sebelumnya, jika Anda memiliki orang-orang yang mengerjakan hal-hal dalam basis kode yang Anda tidak ingin keluar dengan rilis awal)

Ketika bekerja dengan VCS yang membuat penggunaan cabang rumit atau menyakitkan (SourceSafe, svn, dll), maka Anda mungkin akan paling bahagia mempertahankan cabang "rilis" untuk setiap produk yang dirilis, dan melakukan pengembangan utama Anda di "trunk", menggabungkan perubahan dari "trunk" ke cabang "release" jika dan ketika Anda perlu merilis hotfix untuk rilis tersebut.

Jika, di sisi lain, Anda bekerja dengan salah satu sistem VCS baru yang dibangun di sekitar percabangan dan penggabungan (git, Bazaar, Mercurial, dll), maka Anda mungkin akan paling bahagia melakukan pengembangan Anda dalam waktu singkat. Cabang "fitur" hidup. Misalnya, jika Anda bekerja pada AI pathfinding, Anda dapat membuat cabang "pathfinding" dan mengimplementasikan kode di sana. Ketika Anda selesai, Anda menggabungkan cabang itu kembali ke batang utama pengembangan Anda, dan (opsional) menghapus cabang yang sedang Anda kerjakan. Manfaat dari pendekatan ini adalah memungkinkan Anda bekerja pada banyak tugas secara bersamaan, daripada harus menyelesaikan satu tugas sebelum memulai selanjutnya.

Dalam proyek rumah saya saat ini (menggunakan git), saya memiliki lima cabang fitur berbeda yang aktif saat ini, mengerjakan berbagai fitur yang berbeda. Dua di antaranya adalah pendekatan alternatif untuk melakukan hal yang sama (untuk pembuatan profil), dua adalah ide mekanik permainan eksperimental, dan satu adalah refactor besar sistem AI saya, dan sebenarnya rusak sedemikian rupa sehingga kode tidak dapat dikompilasi dengan benar sekarang. Tapi itu dilakukan di cabang fitur untuk referensi dan cadangan, dan rusak tidak menghentikan saya dari bekerja pada fitur-fitur lainnya; Cabang-cabang fitur lainnya (dan trunk pengembangan utama juga) masih mengkompilasi dan berjalan dengan benar.

Dalam pengalaman saya tentang pengembangan game profesional tim besar, kami sebagian besar masih terjebak dengan sistem kontrol versi yang lebih lama (dan didukung secara komersial). Perforce mungkin adalah yang paling umum digunakan, diikuti oleh Subversion. Di mana pun saya bekerja, kami memiliki cabang 'trunk', dan kemudian cabang 'rilis' terpisah untuk setiap hasil (tonggak / demo / rilis / dll). Kadang-kadang seseorang akan membuat cabang pribadi untuk beberapa perubahan besar yang mereka buat atau uji, tetapi ini sangat jarang, dan biasanya untuk hal-hal seperti "mengubah permainan untuk dijalankan dengan perpustakaan fisika yang berbeda ini" yang mungkin tidak benar-benar pergi ke produk yang dirilis.


1
Jawaban yang luar biasa. Saya akan menunggu sedikit sebelum menandainya sebagai jawaban yang diterima untuk melihat apakah orang lain akan membawa sebutir garam berdasarkan pengalaman mereka juga.
Jesse Emond

8

Sudah jawaban yang sangat bagus di atas tetapi satu hal yang perlu diperhatikan adalah kapan Anda ingin melakukan percabangan dan kapan Anda ingin memberi tag.

Sebagian besar vcs memungkinkan Anda memberi tag (terkadang mereka menyebutnya pelabelan). Anda harus menerapkan tag setiap kali Anda membuat build utama (baik untuk playtest, atau uji beta, atau untuk fitur yang masuk). Jika Anda menggunakan semacam Integrasi Berkelanjutan (dan Anda harus) maka sistem CI harus menandai pembuatan yang berhasil. Pada dasarnya setiap kali Anda melakukan sesuatu yang Anda mungkin ingin kembali (baik untuk membuat cabang atau untuk memeriksa kembali bagaimana Anda melakukan sesuatu dalam versi itu) membuat tag / label. Mereka biasanya berbiaya rendah dan mudah ditambahkan.

Hal lain yang sangat saya sarankan adalah menjaga aset dan kode Anda dalam sistem versi yang sama. Memiliki cabang (atau tag) kode sama sekali tidak berguna jika Anda tidak dapat mencocokkan (dan kemudian bercabang) aset. Ini adalah salah satu alasan utama mengapa perusahaan game suka Perforce - sama senangnya menyimpan file seni biner karena menyimpan kode, dan (tidak seperti git), ini dapat dimengerti untuk tipe non-teknis!

Oh, dan kapan pun Anda merasa ingin memeriksa file yang dikompilasi ke dalam VCS Anda, hentikan dan pikirkan bagaimana Anda dapat menghindari hal itu. Dalam pengalaman saya hampir selalu mengarah ke data yang tidak cocok, sumber yang hilang (di mana misalnya tekstur DDS terkompresi diperiksa tetapi tidak png sumber), dan kekacauan di telepon. Jika Anda memiliki pipa aset yang lebih baik dilayani oleh file yang diekspor di-cache di suatu tempat (jadi semua orang tidak menghasilkan kembali set file yang sama) dengan segala cara memiliki proses membangun aset sumber di VCS Anda dan menempatkan file yang diekspor ke dalam cache (atau drive bersama, atau bahkan VCS terpisah). Tapi jangan periksa file yang diekspor dengan tangan - itu akan menggigit Anda (terutama jika Anda bekerja sebagai bagian dari tim).


+1 untuk diskusi tentang pemberian tag (yang ingin saya bicarakan, tetapi tidak yakin bagaimana menyebutkannya tanpa menjadi lebih bertele-tele daripada yang sudah saya lakukan sebelumnya) Poin bagus tentang memeriksa file yang dikompilasi (atau diproses) ke VCS juga, saya telah bekerja di sejumlah tempat yang telah membuat kesalahan itu, dan itu selalu menyebabkan sakit hati.
Trevor Powell

1

Saya menyukai buku itu, dan saya merekomendasikannya kepada semua orang dengan minat yang relevan. Untuk satu proyek indie, tidak perlu bercabang sama sekali kecuali Anda perlu atau ingin membuat versi terpisah; seperti satu untuk Android dan satu untuk PC, atau sesuatu seperti itu.

Seperti yang Anda katakan, jika Anda ingin mengambil kebiasaan yang baik, saya akan pergi dengan pendekatan Mike. Masuk akal dan pendekatan yang saya gunakan dalam proyek indie dua orang laki-laki saya.


1

Apa pun yang Anda butuhkan untuk dapat kembali dan melakukan lebih banyak pekerjaan, harus dapat bercabang (tetapi belum tentu bercabang ... belum).

Alasannya sederhana. Anda harus dapat mengeluarkan versi tetap dari kode itu, bukan kode lain, jadi pada saat itu Anda perlu bekerja pada cabang.

VCS berbeda. Beberapa - seperti git - sangat mudah untuk bercabang dari komit kapan saja, yang lain - seperti CVS - sangat rumit untuk dikerjakan nanti.

Mungkin Anda ingin membuka pertanyaan tentang stackoverflow, menanyakan bagaimana cara terbaik untuk bekerja dengan sistem kontrol versi yang Anda pilih? Jika Anda belum benar - benar memulai dengan banyak riwayat, Anda mungkin ingin membuka pertanyaan yang menjelaskan cara Anda bekerja dan meminta rekomendasi sistem kontrol versi terbaik untuk Anda?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.