Bagaimana Anda mengizinkan kode jaringan untuk ditulis pada tahap pengembangan selanjutnya?

12

Saat ini saya sedang dalam tahap awal menulis sebuah game yang pada akhirnya saya ingin tingkatkan di sebagian besar aspek.
Bagaimana saya bisa berhenti menulis kode jaringan namun membiarkannya cukup mudah diimplementasikan, yaitu, tidak harus menulis ulang seluruh permainan hanya untuk menambahkannya.
Apa yang harus saya ingat?

Saya memiliki pola komponen di mana saya memisahkan fisika / deteksi tabrakan, logika permainan, tipe data dan animasi / rendering satu sama lain.
Bagaimana cara saya menulis klien dan server yang belum memiliki kode jaringan yang dapat diimplementasikan secara lokal?
Apa yang harus saya lakukan di klien dan apa yang harus saya lakukan di server? Haruskah saya semacam berpura-pura memiliki kode jaringan selesai dan mengirim pesan antara server dan klien dan akun untuk keterlambatan dll meskipun tidak akan ada?

Sunting: Ini direncanakan menjadi RPG top-down. Multiplayer sederhana tempat Anda meng-host server untuk teman-teman Anda adalah apa yang saya pikirkan, jadi curang tidak terlalu menjadi masalah (siapa yang ingin bermain dengan teman yang curang?). Masih saya ingin pergi dengan "Server selalu benar" pendekatan.

Sunting 2: Saya kira saya sedang mencari beberapa petunjuk tentang seperti apa pola pikir saya. Bagaimana saya harus menangani input keyboard, animasi, dll, daripada hanya menerapkan setiap efek / perubahan secara instan. Hmmm, saya mungkin perlu membaca dengan benar di jaringan sebelum pergi ke mana pun, yang adalah apa yang saya harapkan dari membuat kerangka jaringan yang bisa bekerja secara lokal.

Ghork
sumber
Itu sangat tergantung pada bagaimana Anda berencana untuk menerapkan kode jaringan Anda begitu Anda sampai di sana. Gempa (atau beberapa judul id kemudian mungkin, ingatan saya sedikit kabur), misalnya, mengambil pendekatan untuk selalu menjadi klien / server. Bahkan opsi pemain tunggal sebenarnya menghubungkan ke server di 127.0.0.1 dan tidak mengundang pemain lain - yang berarti bahkan permainan pemain tunggal berjalan sepenuhnya melalui kode jaringan.
LLL79
Itulah yang ada dalam pikiran saya. Mungkin beberapa proses komunikasi antar sehingga Anda tidak perlu terhubung ketika Anda ingin bermain sendiri atau mungkin kelas yang memiliki fungsi yang sama dengan klien tetapi menanganinya seperti server segera.
Ghork
3
Praktik terbaik adalah "jangan" selama beberapa waktu. Kecuali Anda menulis gim berbasis giliran, Anda hanya perlu merancang berbagai hal secara berbeda untuk menangani jaringan. Jika Anda peduli tentang latensi, kebenaran, dan kecurangan, tidak ada jalan keluar untuk itu. Jika tidak, Anda tidak perlu terlalu memikirkannya - jika Anda tidak memiliki pengalaman, Anda tidak akan dapat memprediksi desain yang tepat dengan baik. Cara terbaik adalah memulai beberapa prototipe jaringan untuk mendapatkan pengalaman jaringan.
Luaan
Jika Anda memikirkannya, minecraft memiliki server lokal bahkan dalam gim pemain tunggal. Server adalah mesin, klien hanyalah presenter.
SparK

Jawaban:

12

Tanpa mengetahui lebih banyak tentang permainan yang Anda tulis, dan bagaimana Anda menulisnya, sangat sulit untuk mengatakan solusi generik untuk masalah Anda.

Namun, Anda mungkin ingin mempertimbangkan keputusan yang Anda ambil ini meninggalkan kode jaringan sampai akhir, tergantung pada seberapa penting jaringan untuk permainan Anda.

Yang saya maksudkan adalah, jika Anda menulis game jaringan yang berat, seperti MMORPG, mungkin tidak bijaksana untuk meninggalkan jaringan sampai akhir.

Yang dipertimbangkan, jika dampak yang Anda harapkan dari kode jaringan rendah (seperti pada, tidak memiliki kode jaringan sama sekali bukan game-breaker), maka bisa tepat untuk membiarkannya untuk tahap kemudian (tapi tidak terlalu terlambat).

Ingatlah bahwa -writing- kode jaringan tidak sama dengan -berpikir- tentangnya. Ketika Anda membuat keputusan tentang bagaimana permainan Anda dibuat, Anda harus mempertimbangkan bagaimana ini akan mempengaruhi keputusan jaringan, dan jika dampak yang diharapkan tinggi, mungkin mengimplementasikannya sebagai rintisan yang memberikan beberapa informasi umum, dan kemudian ketika saatnya menulis jaringan. kode, itu hanya masalah memasukkannya di tempat Anda meninggalkan rintisan.

Jadi, misalnya, jika Anda membuat game catur online, Anda mungkin memiliki fungsi yang disebut ExecuteMove()yang disebut dalam beberapa cara ketika suatu langkah dimasukkan dengan mouse, dan dengan cara lain ketika suatu gerakan dimasukkan dengan keyboard. Pada titik ini, Anda mungkin ingin berpikir tentang membuat rintisan jaringan yang, setelah mendapatkan data yang diperlukan dari host lain (inilah yang Anda tulis di bagian selanjutnya), menelepon ExecuteMove().

Dengan begitu, saat Anda membuat game, Anda akan tahu bagian mana yang dipengaruhi oleh kode jaringan, dan ketika tiba saatnya untuk benar-benar menulis kode jaringan, Anda beberapa langkah di depan.

Jika ini adalah pertama kalinya Anda menulis game berjaringan, pertimbangkan untuk tidak terlalu memikirkan anti kecurangan dan hal-hal seperti itu. Membuat game berjejaring cukup rumit untuk mengharuskan seluruh tim yang terdiri dari orang-orang yang sangat berpengalaman untuk melakukannya untuk game AAA, jadi lambatkan, dan pertama buat gim yang berfungsi, sebelum fokus pada topik yang lebih kompleks.

Akhirnya, jika ini adalah pertama kalinya Anda membuat game, jangan membuatnya terhubung jaringan, silakan. Membuat game sangat kompleks, sehingga setiap persyaratan yang Anda tambahkan ke game Anda akan membuatnya lebih kompleks secara eksponensial.

Piyama Panda
sumber
Yah, itu bukan MMO jadi tidak akan terlalu berat di jaringan. Namun itu bukan permainan papan basi di mana tidak apa-apa untuk mengambil detik sebelum bergerak dilakukan. Saya merasa jaringan harus dipikirkan sejak awal karena, dalam pengalaman saya, menambahkan multipemain pada tahap terakhir tidak akan berhasil. Namun saya tidak ingin menulis kode jaringan dan men-debug itu sebelum saya dapat membuat karakter saya bergerak dan bertabrakan dengan objek.
Ghork
2
@ Ghork: Ah, Anda ingin melihat produk Anda melakukan hal-hal cantik secepat mungkin! Ya, kita semua melakukannya. Tetapi menyerah pada godaan itu tidak akan mengarah pada program yang dirancang dengan baik dan dipikirkan dengan baik.
Lightness Races in Orbit
Saya akan menerima jawaban ini, meskipun saya juga suka jawaban yang lain. Khususnya komentar oleh @Luaan
Ghork
2

Saya berada dalam situasi yang sama, tetapi saya mencoba melakukan simulasi jaringan lebih dari permainan; tapi saya pikir pendekatan saya dapat membantu proses desain Anda.

Pendekatan saya sesuai dengan komentar Anda tentang IPC (komunikasi antar-proses).

Pertama, sebagai latar belakang saya mempelajari buku "Networked Graphics" oleh Steed dan Oliveira. Ini memberikan latar belakang yang baik pada berbagai arsitektur jaringan untuk permainan tergantung pada berbagai kriteria dan jenis permainan. Ini menyediakan alat untuk membantu Anda memutuskan arsitektur gim Anda dan apa yang ingin Anda pasang di jaringan, dan apa yang ingin Anda wujudkan secara lokal.

Kedua, pisahkan komponen jaringan menjadi utas latar belakang yang terpisah sehingga pengembangan game awal Anda dapat memiliki komponen yang dikodekan secara lokal, tetapi Anda terpaksa harus berurusan dengan pemisahan utas. Jangan menggabungkannya dengan fitur lain yang nantinya akan menjadi "latar belakang lokal" tetapi memaksanya menjadi utas latar yang "berpotensi jauh".

Ini akan membantu menjaga logika Anda tetap terpisah dan juga memungkinkan Anda untuk mensimulasikan faktor-faktor keterlambatan jaringan ke dalam proses sehingga Anda juga dapat melihat dampak latensi.

Joe Van Steen
sumber
Kira saya harus memeriksa buku itu! Kedengarannya menjanjikan bisa melakukan apa yang Anda katakan.
Ghork
@ Ghork: Kuncinya adalah mencari tahu arsitektur Anda, apa yang Anda inginkan lokal dan apa yang Anda inginkan di server; atau bagaimana Anda ingin teman sebaya berkomunikasi dan berinteraksi. Buku itu seharusnya membantu. Kemudian letakkan semua yang Anda inginkan dari jauh di sisi lain panggilan pesan IPC melalui serangkaian kode client-server yang (untuk saat ini) semuanya tetap lokal tetapi menyimpan "remote" pada utas yang terpisah. Dalam komponen kelulusan pesan IPC, tambahkan latensi apa pun yang ingin Anda simulasikan. Semoga berhasil!
Joe Van Steen
1

Jika Anda mempelajari semua hal ini, mengapa tidak menulis Versi 1 pemain tunggal sederhana, dan begitu itu bekerja, dengan pengetahuan Anda yang lebih dalam, pikirkan kembali semuanya secara mendalam untuk Versi 2 yang akan multi-pemain?

Etienne Charland
sumber
0

Menerapkan kelas "jaringan palsu" yang meneruskan pesan di antara utas, yang memiliki antarmuka yang sama dengan kelas jaringan. Kemudian Anda dapat menguraikan jaringan palsu untuk memiliki penundaan acak dan kehilangan paket. Akan selalu lebih mudah untuk men-debug kode jaringan dengan kelas palsu daripada dengan jaringan nyata.

ddyer
sumber