Arsitektur java sisi server MMORPG

8

Saat ini saya membuat game MMORPG, yang berbasis giliran. Klien seharusnya berjalan di Android. Sekarang, teman saya sedang membuat grafik, dan saya telah melakukan kelas permainan (pemain, persenjataan, dll.). Sekarang, jika pertarungan dimulai, kelas-kelas dapat dimanipulasi oleh antarmuka (sebenarnya untuk pasangan saya, itu seperti bekerja dengan antarmuka murni, dia tidak memerlukan akses ke kelas implementaton).

Sekarang kita perlu memperkenalkan server game untuk memungkinkan banyak pemain. Dan beberapa pertanyaan yang sangat penting muncul:

1) Haruskah saya menyalin model permainan ke server sepenuhnya, tidak meninggalkan kelas pada klien atau lebih baik memiliki 2 salinan model - 1 di server dan 1 di perangkat dan untuk menyelesaikan sinkronisasi berkala antara mereka?

2) Metode koneksi mana yang harus dipilih antara klien dan server (klien yang terlihat adalah ponsel android)? Adapun server - saya beralih ke java karena saya punya pengalaman dengannya. Tapi sekarang pertanyaannya adalah - apakah lebih baik menggunakan soket untuk tugas ini atau saya dapat menggunakan layanan REST, atau bahkan mungkin untuk menghubungkannya entah bagaimana ke server Java EE yang keren dari sudut pandang saya karena menghilangkan banyak pemrograman komplikasi? Meskipun gim ini multi-pemain, gim ini berbasis giliran, sehingga tidak perlu sering-sering diperbarui.

3) Bagaimana dengan threading? Haruskah setiap klien memiliki utas sendiri (jika ada soket)?

4) Apakah ada buku tentang pemrograman game server NYORPG NYATA di luar sana ???

Artem Moskalev
sumber

Jawaban:

7

Jangan menyalin seluruh model game ke server, Anda tidak ingin memuat semua tekstur dan jerat terperinci di server Anda. Buat sesederhana mungkin, tangani semua proses penting seperti lokasi, kesehatan, gerakan apa pun tetapi jangan memuat semuanya. - JANGAN PERNAH PERCAYA KLIEN.

Ada banyak buku, bersama dengan banyak wiki. Setiap pemasok mesin seperti IdeaFrabrik, Epic Games, Exitgames, Unity (juga mendukung mmo) memiliki dokumentasi yang sangat baik untuk produk mereka. Sebagian besar barang itu bersifat publik sehingga Anda mendapatkan akses ke solusi lengkap dan Anda dapat benar-benar mengetahui cara kerja barang tersebut.

Cara termudah untuk menemukan buku yang Anda butuhkan adalah dengan mencari Amazon untuk MMORPG, kemudian pergi ke kategori buku dan pilih sub kategori "pemrograman". Jika Anda Google itu Anda akan mendapatkan hasil yang tidak diinginkan ...

Ini daftar buku yang saya temukan

Saya belum mempelajari pemrograman server secara mendalam, tetapi kenyataannya, saya hampir memilih solusi engine Unity + Photon Cloud untuk proyek MMORPG saya. (HeroEngine dimenangkan) Sisi server dilakukan dengan yang satu ini di C # dan satu hal yang saya sangat ingat adalah cara hal-hal dijelaskan dalam tutorial.

Mikolaj Marcisz
sumber
Kami tidak menggunakan mesin apa pun karena permainan tidak memerlukannya. Tidak memiliki grafis keren. Jadi kita tidak perlu untuk Unity dengan fitur tertinggi untuk 3D. Buku-buku yang Anda berikan tampaknya terlalu luas - masih belum ada referensi untuk buku yang menjelaskan cara menulis server beban tinggi multi-pemain. Tapi terima kasih atas sarannya.
Artem Moskalev
Anda harus belajar tentang pemrograman klien-server TCP. "Mengatakannya dengan cara brutal, pemrograman server juga digunakan dalam game". Anda harus mempelajari dasarnya. Ini bisa membantu Anda memulainya di Jawa. edn.embarcadero.com/article/31995
Mikolaj Marcisz
Ya, saya tahu itu sudah =) Saya sudah cukup banyak memprogramnya dalam hubungannya dengan JMS dan server string-message sederhana =) Itulah mengapa saya bertanya yang mana + soket yang lebih baik levelnya lebih rendah dibandingkan dengan Java EE yang pernah saya gunakan sebelumnya) Saya hanya tidak tahu bagaimana hal itu dilakukan dengan permainan multi-pemain karena sejauh ini tampaknya pemrograman game-server sama sekali berbeda dari pemrograman situs web atau program pertukaran pesan sederhana)
Artem Moskalev
4

1) Haruskah saya menyalin model permainan ke server sepenuhnya, tidak meninggalkan kelas pada klien atau lebih baik memiliki 2 salinan model - 1 di server dan 1 di perangkat dan untuk menyelesaikan sinkronisasi berkala antara mereka?

Setuju dengan Mikolaj tidak menyalin segalanya. Kirim sesedikit mungkin data. Anda dapat memiliki kelas yang sama (hanya mewakili model data, bukan aset lain) di klien dan server, tetapi jangan mengirimnya melalui internet. Anda ingin membuat cerita bersambung di server dan deserialize di klien. Klien harus mengirim hanya perintah ke server.

2) Metode koneksi mana yang harus dipilih antara klien dan server (klien yang terlihat adalah ponsel android)? Adapun server - saya beralih ke java karena saya punya pengalaman dengannya. Tapi sekarang pertanyaannya adalah - apakah lebih baik menggunakan soket untuk tugas ini atau saya dapat menggunakan layanan REST, atau bahkan mungkin untuk menghubungkannya entah bagaimana ke server Java EE yang keren dari sudut pandang saya karena menghilangkan banyak pemrograman komplikasi? Meskipun gim ini multi-pemain, gim ini berbasis giliran, sehingga tidak perlu sering-sering diperbarui.

Anda sedang merencanakan MMORPG berbasis giliran (tidak tahu bagaimana itu akan bekerja). Jadi kecepatan tidak banyak masalah. Anda dapat menggunakan layanan apa pun, REST mungkin bagus, sederhana. Biasanya MMORPG menggunakan UDP (tidak aman, lebih kecil, lebih cepat) untuk hal-hal seperti pembaruan gerakan di mana satu atau dua paket yang hilang tidak masalah dan TCP (aman, overhead) untuk komunikasi yang aman. Sebagian besar gim mungkin menggunakan semacam protokol khusus terenkripsi dan terkompresi melalui UDP dan TCP untuk membuatnya cepat dan sulit untuk diretas.

3) Bagaimana dengan threading? Haruskah setiap klien memiliki utas sendiri (jika ada soket)?

Biasanya Anda ingin memiliki kumpulan utas. Setiap utas dari layanan kolam satu permintaan, lalu didaur ulang. Ketika Anda tidak memiliki cukup utas, Anda dapat mempertimbangkan memblokir atau mengalokasikan lebih banyak utas.

4) Apakah ada buku tentang pemrograman game server NYORPG NYATA di luar sana ???

Mikolaj sudah mencarinya di Google untuk Anda ...

MartinTeeVarga
sumber
Bisakah Anda menguraikan lebih lanjut tentang kumpulan thread? Jika ada soket, maka server mendengarkan permintaan dan mengalokasikan soket baru untuk masing-masing. Soket-soket tersebut dengan semua informasi yang masuk dapat diringkas sebagai pekerjaan ke utas. Tetapi bagaimana cara mendapatkan kembali thread dari kumpulan thread jika setiap kali thread memiliki pekerjaan yang berbeda? + berapa banyak soket terbuka yang dapat menampung server rata-rata? Apakah akan lebih intensif sumber daya daripada REST atau tidak? + di REST tidak ada status sesi sehingga sulit untuk mempertahankan informasi pemain. Tetapi sisanya di Jawa memiliki integrasi sempurna ke server perusahaan yang bagus
Artem Moskalev
Buku-buku yang diperkenalkan semuanya tentang desain OOP MMORPG seperti yang terlihat dari komentar. Untuk itu Id lebih baik tetap pada GoF. Sekali lagi, sepertinya pemrograman game online multiplayer sisi server adalah semacam pengetahuan suci yang dilewatkan melalui generasi =) Semua forum / posting / buku datang ke ide-ide itu: "jangan coba pemrograman MMO / Pemrograman MMO benar-benar sulit / MMO bukan untuk seorang pemula "... dan TIDAK ADA SARAN sama sekali ...
Artem Moskalev
1
Lihat contoh ini: tutorials.jenkov.com/java-multithreaded-servers/…
MartinTeeVarga
Buku-buku yang diperkenalkan semuanya tentang desain OOP MMORPG seperti yang terlihat dari komentar. Untuk itu Id lebih baik tetap pada GoF. Kalimat ini tidak masuk akal. Juga membangun MMORPG sama dengan membangun pesawat jet. Saya akan mengatakan mendapatkan sayap Anda dengan pesawat kertas.
MartinTeeVarga
Anda benar 100% tentang pesawat kertas =) Tetapi buku-buku itu bahkan bukan tentang pesawat kertas (dengan pesawat kertas yang saya maksud adalah pemrograman sisi server mmo) - Saya sudah belajar bahwa dari komentar di amazon =) Beberapa buku itu berurusan dengan pola desain untuk game MMORPG, yang bisa dipelajari dari buku lain yang lebih baik, dalam konteks yang sama dalam membuat game. + Saya sudah membangun B-2, jadi saya menghargai saran yang bisa saya dapatkan. Terima kasih =)
Artem Moskalev