Bagaimana cara efisien kode klien dan server pada saat yang sama?

15

Saya mengkode permainan saya menggunakan model client-server. Saat bermain di singleplayer, gim ini memulai server lokal, dan berinteraksi dengannya seperti server jarak jauh (multipemain). Saya telah melakukan ini untuk menghindari pengkodean kode singleplayer dan multiplayer terpisah.

Saya baru saja mulai coding dan mengalami masalah besar. Saat ini saya sedang mengembangkan game di Eclipse, dengan mengatur semua kelas game menjadi beberapa paket. Kemudian, dalam kode server saya, saya hanya menggunakan semua kelas dalam paket klien.

Masalahnya adalah, kelas-kelas klien ini memiliki variabel yang khusus untuk rendering, yang jelas tidak akan dilakukan pada server.

Haruskah saya membuat versi modifikasi dari kelas klien untuk digunakan di server? Atau haruskah saya memodifikasi kelas klien dengan boolean, untuk menunjukkan apakah klien / server menggunakannya. Apakah ada opsi lain yang saya miliki? Saya baru saja berpikir tentang mungkin menggunakan kelas server sebagai kelas inti, kemudian memperluasnya dengan merender hal?

liamzebedee
sumber
Apakah Anda memiliki opsi pra-prosesor? Seperti #ifdef KLIEN <beberapa kode> # endif. Itu cara sederhana untuk memiliki file kelas bersama, yang bisa berbeda antara server dan klien dan juga berbagi bagian. Tapi agak berantakan.
William Mariager
Saya setuju dengan MindWorX. Meskipun kompilasi bersyarat merupakan masalah di Jawa, ada solusi yang harus dipertimbangkan.
sam hocevar
1
Kompilasi bersyarat adalah cara kasar untuk mengatakan "Saya tidak memasukkan cukup waktu desain ke dalam paket saya," menurut saya =) "Agak berantakan" biasanya diterjemahkan menjadi "Apa-apaan ini?" enam bulan kemudian ketika Anda membaca ulang bahkan kode Anda sendiri dan tidak produktif untuk apa pun kecuali prototipe yang dibuang.
Patrick Hughes

Jawaban:

23

Anda harus memilih untuk menjaga kode rendering Anda terpisah dari logika game Anda , karena itu adalah masalah yang berbeda .

Jika Anda memisahkan kode rendering dari kode klien / server, Anda mendapatkan beberapa keuntungan:

  • Membuat server khusus akan lebih mudah, karena kode apa pun yang dirender akan berada di satu tempat.
  • Anda dapat memisahkan updatefase Anda dari renderfase Anda , dan menjalankannya pada waktu yang berbeda.
  • Anda dapat memastikan kode rendering Anda tidak mengubah kondisi permainan, dengan menggunakan const, mengurangi bug.
Blair Holloway
sumber
1
+1 Saya sangat setuju dengan sentimen ini. Memisahkan pemodelan data dari tampilan yang diberikan model itu akan memungkinkan Anda melakukan hal-hal yang rapi seperti beberapa jendela yang menampilkan informasi berbeda, port rendering ke platform lain, tambahkan analisis dan atur simulasi Anda untuk gameplay semua tanpa harus menyentuh 90% dari basis kode Anda .
Patrick Hughes
5

Saya pikir Anda harus memisahkan kode klien dan server. Kode server dan kode klien tidak boleh saling mengenal kecuali untuk fungsionalitas yang terpapar dengan antarmuka. Server seharusnya tidak tahu apa-apa tentang rendering, hanya mendaftarkan klien, melacak posisi, waktu, dll. Jika Anda memiliki masalah yang dipisahkan dengan bersih, lebih mudah untuk mempertahankan dan mengembangkan game Anda lebih lanjut. Semoga ini bisa membantu sedikit.

loodakrawa
sumber
+1 Saya cenderung setuju dengan ini. Jika server akan menjalankan klien apa pun, maka itu harus dilakukan sebagai proses terpisah.
Insinyur
5

Pemisahan kekhawatiran FTW, seperti yang lain katakan, tetapi jika tujuan akhir Anda adalah untuk memiliki aplikasi klien dan server yang terpisah, Anda perlu mengambil langkah lebih jauh. Anda perlu menentukan apa yang spesifik untuk klien, apa yang spesifik untuk server, dan apa yang dibagikan. Untuk semua yang dibagikan, pisahkan menjadi kelas kode yang dibagikan secara eksklusif; kelas khusus klien atau server kemudian dapat mensubklasifikasikan atau mereferensikan kelas bersama sesuai kebutuhan. Pindahkan kelas bersama ke proyek yang terpisah, membangun JAR "shared library", dan memasukkan JAR itu di proyek klien dan server.

Ini memiliki beberapa keuntungan: ini membuat pemisahan keprihatinan menjadi jelas untuk menjaga segala sesuatu dalam proyek yang terpisah; itu meyakinkan Anda bahwa klien dan server mulai dengan kode bersama yang sama (selama mereka menggunakan versi yang sama dari JAR bersama); dan membuatnya tidak mungkin untuk "secara tidak sengaja" memodifikasi kode bersama tanpa menyadarinya. Jika kode yang dibagikan ada di proyeknya sendiri, Anda akan tahu kapan Anda mengedit apa pun dalam proyek itu yang perlu Anda ketahui bagaimana perubahan akan mempengaruhi klien dan server.

Adrian
sumber