Hem sunucuyu hem de istemciyi aynı işlemde çalıştırma


9

Soru

İlk kez Lidgren ve ağ ile çalışmaya başladım ve hem sunucuyu hem de istemciyi aynı süreç içinde çalıştırmanın mümkün olduğunu fark ettim .

Bu uygulama herhangi bir nedenle önerilmez mi?

bağlam

Sormamın nedeni, bu konseptin hem tek oyunculu hem de çok oyunculu modları tek ve aynı şekilde ele almama izin verebileceğinden teorikleştiğimden, bu çok yararlı olacaktır.

Düşüncelerimin ardından aklımdaki dağılım bu:

  • Singleplayer - Aynı süreçte 1 sunucu + 1 istemci. İletişim ne kadar hızlı?
  • Çok - her biri için konak + 1 AIP müşteri için singleplayer aynı diğer oyuncu.

Görüntülediğim yürütme akışı, istemcilerin kullanıcı girdisini alması ve sunucuya bildirim göndermesidir. Sonra sunucu bunu doğrular ve tüm istemciler tarafından yürütülecek bir eylem yayınlar. Yalnızca bir istemci (yani tek oyunculu) veya birden fazla istemci (yani çok oyunculu) olması önemli değildir.

Yanıtlar:


7

Bu temelde, iplik sorusuna karşı bir süreçtir, her ikisi de çok farklı değildir, bazen ipliklere hafif süreçler denir. En büyük fark, ayrı bir işlemin kendi adres alanı olması, ancak başka farklılıklar olmasıdır (1):

İşlem başına

  • adres alanı
  • Global değişkenler
  • Dosyaları aç
  • Alt süreçler
  • Bekleyen alarmlar, kesmeler ve sinyal işleyicileri

Konu başına

  • Program sayıcı
  • Defterleri
  • yığın
  • Durum

Bu farklılıklara dayanarak, dosya tanıtıcılarını ve genel değişkenleri paylaşabilmeniz için aynı işlemde bir sunucu ve istemci iş parçacığına sahip olmak kullanışlı olabilir. Bu, 'aynı işlemde' yaklaşımı için bir argüman, başka bir (küçük) argüman ise işlem başına yalnızca bir 'Windows Güvenlik Duvarı' pop-up'ı almanızdır. 'Farklı süreç' yaklaşımı için bir argüman, bir kişinin birden fazla istemci çalıştırmak zorunda kalmadan birden fazla sunucu çalıştırabilmesidir. Bu, kurulum gibi özel bir ev sahibi için ideal olacaktır ve birinci şahıs nişancılarda yaygın olarak gördüğümüz bir yaklaşımdır.

Şimdi çevrimdışı oyun için (ve belki de tek oyunculu için bile) bir sunucu işlemine veya iş parçacığına sahip olma fikrine gelince, bu pratikte çok kullanılan harika bir fikirdir. Yükleme ekranına bakarak birçok oyunun bunu yaptığını söyleyebilirsin, 'alma' gibi küçük ipuçları onu verir. Bunu yapmak mantıklıdır çünkü çok oyunculu yapacaksanız oyun kurallarının çoğu sunucu tarafından yönetilecektir, o zaman neden tek oyunculu olarak onları yönetmiyorsunuz? Bu, yazmanız gereken kodu azaltır ve istemci ile 'oyun' arasında daha net bir ayrım sağlar ve bu da kod kalitenizi iyileştirir.

Şimdi süreçler ve iş parçacıkları arasında iletişim kurmaya ne dersiniz? Çapraz süreç iletişimi birçok şekilde yapılabilir (adlandırılmış-) borular, paylaşılan bellek, COM, gerçekten kullandığınız teknolojiye bağlıdır. Ancak bir sunucu yapıyorsanız, muhtemelen soket ve TCP benzeri bir şey kullanarak bir ağ varyasyonu ile gitmek isteyeceksiniz, elbette LIDGREN kullanışlı olacaktır.

Bu tekniklerin birçoğu çapraz iplik iletişimi için de geçerlidir. Ancak bu daha çok kullandığınız tekniklere bağlıdır. Yine TCP ile gidebilirsiniz, ancak belki de daha basit bir sistem olaylar ve bazı marshalling olacaktır, ancak bu oyun döngünüzü belirleyici olmayabilir (2).

Kaynaklar

  1. İşletim sistemleri tasarımı ve uygulaması (MINIX kitabı), 3. baskı, Andrew S. Tanenbaum
  2. Glenn Fiedler tarafından zamanınızı düzeltin: http://gafferongames.com/game-physics/fix-your-timestep/

1
Tek ekim, yerel istemcinin uzak istemcilerle aynı kodu kullanarak yerel sunucu ile sorunsuz bir şekilde çalışmasını istiyorsanız ve bu istemcinin, uzak bir sunucuya bağlanmak için aynı kodu tekrar kullanmasını istiyorsanız 1) sunucu için bir işlem kullanın ve 2) ortak payda olduğu için ağ iletişimi kullanın. Taşıma kodunuzun iki versiyonunu yazmak istemiyorsanız, yine de =)
Patrick Hughes
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.