Ağ kodunun geliştirmenin sonraki aşamalarında yazılmasına nasıl izin verirsiniz?


12

Şu anda, çoğu yönden geliştirmek isteyeceğim bir oyun yazmanın erken gelişimindeyim.
Ağ kodunu yazarken nasıl atlayabilirim, ancak bunu oldukça kolay bir şekilde uygulayarak bırakarak, sadece eklemek için tüm oyunu yeniden yazmak zorunda kalmam.
Aklımda ne var?

Fizik / çarpışma algılama, oyun mantığı, veri türleri ve canlandırma / oluşturma işlemlerini birbirinden ayırdığım bir bileşen desenim var.
Henüz ağ kodu uygulanmamış bir istemci ve sunucuyu yerel olarak sınanabilir nasıl yazabilirim?
İstemcide ne yapmalıyım ve sunucuda ne yapmalıyım? Sadece ağ kodu bitmiş gibi davranmalıyım ve hiçbiri olmayacak olsa bile sunucu ve istemci ve gecikmeler için hesap arasında mesaj gönderir miyim?

Edit: Yukarıdan aşağıya bir RPG olması planlanıyor. Arkadaşlarınız için bir sunucuya ev sahipliği yaptığınız basit çok oyunculu, düşündüğüm şey, bu yüzden hile yapmak çok fazla bir sorun değil (hile arkadaşlarla oynamak ister?). Yine de bir "Sunucu her zaman haklıdır" - yaklaşımı ile gitmek istiyorum.

Edit 2: Sanırım zihnimin nasıl olması gerektiğine dair bazı işaretler arıyorum. Her efekti / değişikliği anında uygulamak yerine klavye girişini, canlandırmayı vb. Nasıl yapmalıyım? Hmmm, sonuçta herhangi bir yere gitmeden önce ağ üzerinde düzgün bir şekilde okumam gerekebilir, bu da yerel olarak çalışabilecek bir tür ağ iskeleti yaparak kurtulmayı umduğum şeydi.


Bu çok yoğun bir şekilde oraya vardığınızda ağ kodunuzu nasıl uygulamayı planladığınıza bağlıdır. Örneğin, Quake (ya da daha sonraki bir kimlik başlığı belki hafızam biraz bulanık), her zaman istemci / sunucu olma yaklaşımını benimsedi. Tek oyunculu seçenek bile 127.0.0.1'de bir sunucuya bağlanıyor ve diğer oyuncuları davet etmiyor - yani tek oyunculu oyun bile tamamen ağ kodu üzerinden çalışıyor.
LLL79

Bu benim aklımda olan şeydi. Belki bazı süreçler arası iletişim, böylece yalnız oynamak istediğinizde veya istemciyle aynı işlevlere sahip olan ancak hemen sunucu gibi işleyen bir sınıf bağlamanız gerekmez.
Ghork

3
En iyi uygulama bir süredir “yapma” dı. Sıra tabanlı bir oyun yazmıyorsanız, ağ iletişimi için işleri farklı şekilde tasarlamanız yeterlidir. Gecikmeyi, doğruluğu ve hile yapmayı önemsiyorsanız, bunun etrafında bir yol yoktur. Eğer yapmazsanız, gerçekten bu kadar çok düşünmeniz gerekmez - eğer deneyiminiz yoksa, uygun tasarımı yeterince iyi tahmin edemezsiniz. En iyi yol, gerçekten ağ deneyimi kazanmak için birkaç ağ prototipine başlamaktır.
Luaan

Eğer düşünürseniz, Minecraft tek oyunculu oyunlarda bile yerel bir sunucuya sahiptir. Sunucu motor, istemci sadece bir sunucu.
SparK

Yanıtlar:


12

Tam olarak yazdığınız oyun ve nasıl yazdığınız hakkında daha fazla bilgi sahibi olmadan, probleminize genel çözümler söylemek çok zordur.

Ancak, oyun için ağın ne kadar önemli olduğuna bağlı olarak, ağ kodunu sonuna kadar bıraktığınız bu kararı dikkate almak isteyebilirsiniz.

Demek istediğim, MMORPG gibi ağır bir ağ oyunu yazıyorsanız, ağları sonuna kadar bırakmak akıllıca olmayabilir.

Bu, ağ kodu için beklediğiniz etki düşükse (olduğu gibi, ağ koduna sahip olmamak oyun kırıcı değilse), daha sonra (ancak çok geç değil) bir aşamada bırakmak uygun olabilir.

-Writing- ağ kodunun, -winking- ile aynı olmadığını unutmayın. Oyununuzun nasıl yapıldığına dair kararlar verirken, bunun ağ kararlarını nasıl etkileyeceğini düşünmelisiniz ve beklenen etki yüksekse, belki de bazı genel bilgiler veren bir saplama olarak ve ardından ağ yazmanın zamanı geldiğinde düşünmelisiniz. kod, sadece saplama bıraktığınız yere takma meselesidir.

Yani, örneğin, bir online satranç oyunu yapıyorsanız, ExecuteMove()bir hareket fare ile girildiğinde bir şekilde çağrılır ve başka bir şekilde klavye ile bir hareket girildiğinde çağrılan bir fonksiyonunuz olabilir . Bu noktada, diğer ana bilgisayardan gerekli verileri aldıktan sonra (bu daha sonraki bir bölümde yazdığınız şeydir) çağıran bir ağ saplaması oluşturmayı düşünmek isteyebilirsiniz ExecuteMove().

Bu şekilde, oyununuzu oluştururken, hangi parçaların ağ kodundan etkilendiğini bileceksiniz ve ağ kodunu gerçekten yazmanın zamanı geldiğinde, birkaç adım öndesiniz.

İlk kez ağa bağlı bir oyun yazıyorsanız, hile karşıtı ve bunun gibi şeyler hakkında fazla düşünmeyin. Ağa bağlı bir oyun yapmak, bir AAA oyunu için bunu yapmak için son derece deneyimli bir ekibin tamamlanmasını gerektirecek kadar karmaşıktır, bu yüzden yavaşlayın ve daha karmaşık konulara odaklanmadan önce işe yarayan bir oyun yapın.

Son olarak, eğer ilk kez bir oyun yapıyorsanız, lütfen ağa bağlamayın, lütfen. Bir oyun yapmak o kadar karmaşıktır ki, oyununuza eklediğiniz her gereksinim onu ​​katlanarak daha karmaşık hale getirecektir.


Evet, bu MMO değil, bu yüzden ağ üzerinde bu kadar ağır olmayacak. Ancak, bir hamle yapılmadan önce saniyeler sürmenin iyi olmadığı eski bir masa oyunu değil. Ağ oluşturmanın erken düşünülmesi gerektiğini düşünüyorum, çünkü tecrübelerime göre, son aşamalarda çok oyunculu eklemek işe yaramayacak. Ancak, ağ kodunu yazmak ve karakterimi hareket ettirip nesnelerle çarpışmadan önce hata ayıklamak istemiyorum.
Ghork

2
@Ghork: Ah, ürününüzün mümkün olan en kısa sürede güzel şeyler yaptığını görmek istiyorsunuz! Evet, hepimiz yapıyoruz. Ancak bu cazibeye yenik düşmek, iyi tasarlanmış ve iyi düşünülmüş bir programa yol açmayacaktır.
Yörüngedeki Hafiflik Yarışları

Diğer cevapları da sevsem de bu yanıtı kabul edeceğim. @Luaan
Ghork

2

Benzer bir durumdayım, ama bir oyundan çok ağa bağlı bir simülasyon yapmaya çalışıyorum; ama benim yaklaşımımın tasarım sürecinize yardımcı olabileceğini düşünüyorum.

Benim yaklaşımım IPC (süreçler arası iletişim) hakkındaki yorumunuz boyunca.

İlk olarak, arka plan olarak Steed ve Oliveira tarafından "Ağa Bağlı Grafikler" kitabını inceliyorum. Bu, çeşitli kriterlere ve oyun türlerine bağlı olarak oyunlar için çeşitli ağ mimarileri hakkında iyi bir arka plan sağlar. Oyun mimarinize ve ağa tam olarak ne koymak istediğinize ve yerel olarak ne yapmak istediğinize karar vermenize yardımcı olacak bir araç sağlar.

İkinci olarak, ağ oyun bileşenlerini ayrı bir arka plan iş parçacığına ayırın, böylece ilk oyun geliştirmeniz bileşeni yerel olarak kodlayabilir, ancak iş parçacığı ayrımı ile uğraşmak zorunda kalırsınız. Bunları daha sonra "yerel arka plan" olacak diğer özelliklerle birleştirmeyin, ancak "potansiyel olarak uzak" arka plan iş parçacıklarına zorlayın.

Bu, mantığınızın ayrılmasına yardımcı olur ve gecikme etkisini de görebilmeniz için ağ gecikme faktörlerini sürece benzetmenize olanak tanır.


Sanırım o kitabı kontrol etmek zorundayım! Söylediklerini yapabilmek umut verici geliyor.
Ghork

@Ghork: Anahtar, mimarinizi, yerel olarak ne istediğinizi ve bir sunucuda ne istediğinizi bulmaktır; veya arkadaşlarınızın nasıl iletişim kurmasını ve etkileşimde bulunmasını istediğinizi. Bu kitap yardımcı olmalı. Daha sonra, uzak olmasını istediğiniz her şeyi bir IPC mesaj çağrısının diğer tarafına koyun (şimdilik) tüm yerel kalır ancak ayrı iş parçacıkları üzerinde "uzak" şeyler tutar. IPC ileti geçirme bileşeninde, benzetimini yapmak istediğiniz gecikmeleri yapay olarak ekleyin. İyi şanslar!
Joe Van Steen

1

Tüm bunları öğreniyorsanız, neden basit bir tek oyunculu Sürüm 1 yazmıyorsunuz ve işe yaradığında, daha derin bilginizle, çok oyunculu olacak Sürüm 2 için her şeyi derinlemesine yeniden düşünün?


0

Ağ sınıfıyla aynı arabirime sahip olan iş parçacıkları arasında ileti ileten bir "sahte ağ" sınıfı uygulayın. Daha sonra sahte ağı rastgele gecikmelere ve paket kaybına sahip olacak şekilde ayrıntılandırabilirsiniz. Sahte kodla ağ kodunda hata ayıklamak her zaman gerçek ağdan daha kolay olacaktır.

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.