Hem istemci hem de sunucuyu aynı anda nasıl verimli bir şekilde kodlayabilirim?


15

Oyunumu bir istemci-sunucu modeli kullanarak kodluyorum. Tek oyuncuda oynarken, oyun yerel bir sunucu başlatır ve onunla uzak bir sunucu (çok oyunculu) gibi etkileşime girer. Bunu ayrı singleplayer ve çok oyunculu kod kodlamak önlemek için yaptım.

Kodlamaya yeni başladım ve büyük bir sorunla karşılaştım. Şu anda Eclipse'de tüm oyun sınıflarını paketler halinde düzenleyerek oyunu geliştiriyorum. Sonra, sunucu kodumda, sadece istemci paketlerindeki tüm sınıfları kullanıyorum.

Sorun şu ki, bu istemci sınıfları, açıkça bir sunucuda gerçekleştirilmeyecek oluşturma işlemine özgü değişkenlere sahiptir.

Sunucuda kullanmak için istemci sınıflarının değiştirilmiş sürümlerini oluşturmalı mıyım? Ya da sadece istemci / sunucu onu kullanarak belirtmek için bir boolean ile istemci sınıfları değiştirmek gerekir. Sahip olduğum başka seçenekler var mı? Ben sadece çekirdek sınıf olarak sunucu sınıfını kullanma, sonra render malzeme ile genişletme hakkında bir düşünce vardı?


İşlemci öncesi seçenekleriniz var mı? #İfdef MÜŞTERİ <bazı kod> # endif gibi. Bu, sunucu ve istemci arasında farklı olabilen ve parçaları paylaşan paylaşılan sınıf dosyalarına sahip olmanın basit bir yoludur. Gerçi biraz dağınık.
William Mariager

MindWorX ile hemfikirim. Koşullu derleme Java'da bir acı olsa da, dikkate alınması gereken çözümler vardır.
sam hocevar

1
Koşullu derleme, "Paketlerime yeterli tasarım zamanı koymadım" demenin kaba bir yoludur, bence =) "Biraz dağınık" genellikle "Bu ne halt eder?" altı ay sonra kendi kodunuzu bile yeniden okuduğunuzda ve tek kullanımlık prototipler dışında her şey için karşı üretken olduğunuzda.
Patrick Hughes

Yanıtlar:


23

Oluşturma kodunuzu , ayrı kaygılar olduğundan oyun mantığınızdan ayrı tutmayı tercih etmelisiniz .

Oluşturma kodunuzu istemci / sunucu kodunuzdan ayırırsanız, birkaç avantaj elde edersiniz:

  • Oluşturulan herhangi bir kod tek bir yerde olacağından, özel bir sunucu oluşturmak daha kolay olacaktır.
  • Eğer ayırabilirsiniz updatesenin dan faz renderfaz ve farklı dilimler onları çalıştırın.
  • Oluşturma kodunuzun consthataları azaltarak oyun durumunu değiştirmediğinden emin olabilirsiniz .

1
+1 Bu düşünceye daha fazla katlanamıyorum. Veri modellemenin bu modelin oluşturulmuş görünümlerinden ayrılması, kod tabanınızın% 90'ına dokunmanıza gerek kalmadan farklı bilgiler gösteren, oluşturmayı diğer platformlara taşıyan, analiz ekleyen ve oyun simülasyonunu değiştiren çoklu pencereler gibi temiz şeyler yapmanızı sağlar. .
Patrick Hughes

5

İstemci ve sunucu kodunu temiz bir şekilde ayırmanız gerektiğini düşünüyorum. Sunucu kodu ve istemci kodu, arabirimlerle karşılaşan işlevler dışında birbirlerini bilmemelidir. Sunucunun renderleme, sadece istemcileri kaydetme, pozisyonları, zamanı, vb. İle ilgili bir şey bilmemesi gerekiyor. Temiz bir şekilde endişeleriniz varsa, oyununuzu korumak ve geliştirmek daha kolaydır. Umarım bu biraz yardımcı olur.


+1 Buna katılıyorum. Sunucu herhangi bir istemciyi çalıştıracaksa, bunu ayrı işlemler olarak yapmalıdır.
Mühendis

5

Endişelerin ayrılması FTW, diğerlerinin söylediği gibi, ancak nihai hedefiniz ayrı istemci ve sunucu uygulamalarına sahipse, bunu bir adım daha ileri götürmeniz gerekir. Neyin müşteriye, neyin sunucuya ve neyin paylaşıldığına karar vermeniz gerekir. Paylaşılan her şey için, onu yalnızca paylaşılan kod sınıflarına ayırın; istemci veya sunucuya özgü sınıflar daha sonra uygun şekilde paylaşılan sınıfları alt sınıflandırabilir veya bunlara başvurabilir. Paylaşılan sınıfları ayrı bir projeye taşıyın ve bir "paylaşılan kitaplık" JAR oluşturun ve bu JAR'ı hem istemci hem de sunucu projelerine dahil edin.

Bunun birkaç avantajı vardır: her şeyi ayrı projelerde tutmak için endişelerin ayrılmasını berraklaştırır; istemcinin ve sunucunun aynı paylaşılan kodla başlamasını sağlar (paylaşılan JAR'ın aynı sürümünü kullandıkları sürece); paylaşılan kodu fark etmeden "yanlışlıkla" değiştirmeyi imkansız hale getirir. Paylaşılan kod kendi projesindeyse, o projede herhangi bir şeyi düzenlerken değişikliklerin hem istemciyi hem de sunucuyu nasıl etkileyeceğini bilmeniz gerektiğini bilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.