Modern çok oyunculu oyunlarda ortam gibi büyük, statik nesneler sunucudan istemciye aktarılıyor mu?


18

Yetkili bir sistemim var, burada oyuncu maça katıldığında, zaten ortaya çıkan tüm nesneleri alır - kendi kendine (istemci) ortaya çıkar.

Şöyle görünüyor:

  1. Client erişim kodunu Server
  2. Client kabul eder Server
  3. Client sahneyi oyun sahnesine geçirir
  4. Serveroyuncuları, kasaları, etkileşime girebileceğiniz nesneleri gönderir, böylece clientonları ortaya çıkarabilir ve görüntüleyebilirsiniz.

Peki ya temel nesne? Şimdilik, sunucuda ve istemcide aynı sahneye sahibim - bir statik düzlem zemin görevi görüyor. Şu anda yeni şeyler, ağaçlar, merdivenler ekliyorum ve birlikte bir şeyler inşa ediyorum.

Düşündüm - biz iyiyiz. Ancak ortam da senkronize edilmemeli mi? Bir şekilde ağa bağlanacak mısınız? Sunucu sahibi misiniz?

Hadi alalım League of Legends:

resim açıklamasını buraya girin

Statik bir ortam, muhtemelen bir birleşik kafes (merdivenler, çimen, duvarlar, dükkan). Ancak bu gerçekten istemcide tutuluyor mu yoksa yükleme ekranı sırasında sunucu tarafından mı gönderiliyor?


1
Hatta lig karakterlerine ve çevreye özel kaplamalar ekleyebileceğiniz noktadan da düşünebilirsiniz. Onları sunucuya göndermezsiniz, yerel olarak görüntülenirler, bu nedenle yerel olarak depolandıkları ve oluşturuldukları sonucuna varmak mantıklıdır. Ayrıca, oynanışı etkilemezler, eğer çarpışmalar hakkında soruyorsanız, bunlar sunucu ve istemcinin bir karışımıdır, böylece oyuncu hile yapamaz ve duvarlardan geçemez.
Candid Moon _Max_

Yanıtlar:


41

Çoğunlukla, hayır, herhangi bir türden sanat varlıkları rutin olarak ağ üzerinden gönderilmez. Genellikle tüm müşteriler yerel olarak aynı içerik öğelerine sahip olur. İçeriğin kontrol edilmesi veya benzer bir yöntemle durumun böyle olduğundan emin olmak için kod olabilir. Kullanıcıların bazı içerik istemcileriyle oynadıkları konusunda endişeleriniz varsa, benzer bir sistem uygulayabilirsiniz.

Sunucu, istemciye belirli varlıkları görüntülemesi veya gizlemesi gerektiğini belirten yönergeler gönderebilir, ancak varlığın gerçek verilerini göndermez. Bu, pratikte çok savurgan ve yavaştır ve sınırlı veri bulunan kişilerde gerçek sorunlara neden olabilir.

Belirli durumlarda, eğer varlık bir şekilde "spoyler" veya başka bir şey olarak kabul edilirse, daha küçük varlıklar bütünüyle akışa alınabilir. Ancak bu nadirdir. Genelde gördüğünüz şey, bir oyunun bir yamadan veya başka bir şeyden yeni içerik indirebileceğidir , ancak bu, başlangıçtaki yama işlemi sırasında yalnızca bir kez gerçekleşir. Oyun sırasında değil.


21
Bu yanıtın yalnızca statik varlıkları ele aldığını unutmayın. Dinamik / oynatıcı tarafından oluşturulan varlıkların (örn. Minecraft dünya parçaları veya oyuncuların yükleyebileceği MMORPG guild logoları) iletilmesi gerekir. Ancak o zaman bile, genellikle gerekli veri miktarını en aza indirmeye çalışır (Minecraft örneğine devam etmek için: tüm parçalar yerine blok güncellemeleri gönderme, sadece değişen blok tipini / durumunu ve koordinatını gösterir) ve / veya istemci tarafında verileri önbelleğe alır .
hoffmale

@hoffmale Evet, iyi bir nokta; soru sonunda peyzajın durağan olduğunu belirtti, bu yüzden bu noktayı yükseltmeyi düşünmedim, ama iyi bir soru.

3
Bir varlık spoiler ise, genellikle varlık istemcide olur, şifrelenir ve şifre çözme anahtarı, varlık gerektiğinde sunucudan istemciye iletilir.
Grant Davis

4
Örneğin, ağaçları bir haritaya rastgele yerleştirmeniz gerekiyorsa, ağaçların koordinatlarını istemciye göndermek yerine, istemciye tohumu (rastgele sayı üretecinin) gönderir.
Grant Davis

5

Oyun türü de dahil olmak üzere çeşitli faktörlere bağlıdır (açık dünya MMO'nun da akla gelmesine rağmen, burada RTS olduğunu varsayacağım). Bir yerel, oyuncuya arazi durumu bağlantıda gönderilir veya müşterinin varlıklarının bir parçasıdır - haritanın müşteri ile birlikte gönderildiği veya oyun başlamadan önce indirildiği bir RTS oyunu düşünün.

Gerçekten de, kafes çoğu RTS vakasında zaten istemcide olacağı için genellikle gönderilmez. İkisini senkronize tutmak için gerçekten önemli olan çarpışma haritasının gönderilip gönderilmediği başka bir sorudur. Ancak çoğu RTS'de, bu yine istemcide önceden depolanır.

Gerçekten, her şey RTS'nizin neyle birlikte geldiğine, oyun zamanından önce veya oyunun başladığı zaman harita indirip indirmediğinize bağlıdır.

Bundan sonra, senkronize kalmanın birkaç tipik yolu vardır:

  • Deltalar istemciye gönderilir - yerel / istemci dünyasını sunucu ile güncel tutmanın en yaygın ve etkili yolu;
  • Sağlama toplamları zaman zaman dünya durumunun gerçekten eşleştiğinden emin olmak için sunucudan istemciye veya istemciden sunucuya gönderilir;
  • Bazen, tam durum, genellikle kayan nokta sapması gibi teknik kaygıların bir sonucu olarak müşteriyi yeniden senkronize etmek için yeniden gönderilir.

4

Sorulan soruya gelince, League of Legends'ın bunu nasıl ele aldığını bilmiyorum. O oyunu hiç oynamadım, bu yüzden gerekip gerekmediğini öneremem.

Ancak sorunuzun cevabı genel olarak oldukça basit ve anlaşılır:

Veriler statikse ve bilirseniz kesin o edeceğini asla değişiklik (kısa periyodik tam oyun güncellemeleri, ama en ayırmak olduğunu), o zaman neden hiç bu ekstra veri göndermek ister ki? Genellikle kaçınılabilecek her şeyi göndermekten kaçınırsınız. Bu iletişim bir ise yalnızca veri göndermek gerek .

Öte yandan, veriler zamanla değişecekse veya bu seçeneği açık bırakmak istiyorsanız, bu konuda gerçekten herhangi bir seçeneğiniz var mı? Bu durum için, gereken veri göndermek. Aksi takdirde müşterinin ihtiyacı olan şey yoktur.

Bu yalnızca arazi verileri için değil, tüm ağ iletişimleri için geçerlidir. Herşey .


2

Hayır.

League of Legends'ın kaynağında kazma konusunda bir fuar yaptım ve Şampiyon modelleri, Dükkan sahibi, genel harita arka planı ve gerçeğin ardından eklenen tüylü yaratıklar da dahil olmak üzere her şey (bazı kayalarda küçük sincap ve bir salyangoz gibi) nehir) müşteri tarafında tutulur. Müşterinin tüm bu modellere sahip olması, LoL'nin birçok gigabayt büyük olmasının nedenlerinden biridir.

Sunucudan istemciye tüm bu verilerin aktarılması cehennem olur, sadece bir sonraki oyunda tekrar yapmak için bant genişliği kullanımı yoluyla çiğnemeden bahsetmiyorum.

Peki o zaman nasıl çözüldü? Her oyuncu SADECE oyundaki diğer oyuncular için önemli olan verileri sunucuya gönderir . Kimsenin Q bekleme süresinde 5 saniyeniz kaldığını veya Deep Terror Thresh Skin'in sizin için kabarcıklar oluşturup oluşturmadığını bilmesine gerek yok. Oyunda geçen şeyler Vel'Koz Döküm Q, Viktor sola taşındı, vb.

Daha açık bir şekilde, yükleme ekranı ile ilgili olarak, bunu gündeme getirdiğinizde, meydana gelen şeyler, her oyuncunun oyun başlamadan önce isyancı sunucularıyla konuşması, güvenli bağlantı tokalaşmaları ve hile önleme protokolleri gibi şeyler var.

NOT:

İstemcinin sahip olduğu şeylere bakmak istiyorsanız ve bu nedenle sunucu sizi geçmezse, C: \ Riot Games \ RADS \ lol_Game_Client \ Projects klasörünü bulun (bu biraz kapalı olabilir, affedersiniz ' m şimdi bellek kapalı çalışma) ve çevrimiçi bir .RAF dosyası paketinden çıkarıcı bulun. Ardından, ekran sıçramalarını ve cilt dokularını, hatta şampiyon iskeletlerini yüklemek gibi yerel olarak barındırılan tüm şeyleri görebilirsiniz.


1
Bunu uygulamanın açık bir yolu, müşterinin (adanmış bir varlık sunucusundan) zaten yerel olarak depolanmadığı varlıkları talep etmesini sağlamaktır ve bunları aldığında, bunları (yarı) kalıcı olarak ekler. disk üzerinde yerel kalıcı depo. Bu şekilde varlıklar yalnızca bir kez ve yalnızca gerçekten ihtiyaç duyulduğunda indirilir. (Bu işe yaradığında, müşterinin yerel mağazasını, ihtiyaç duyulması muhtemel varlıklarla önceden doldurmak için bir optimizasyon olacaktır. Bu, oyunun yükleyici paketini büyütmek pahasına, oyunun ilk bağlantıda başlama süresini azaltır)
Jeremy Friesner

1
@JeremyFriesner Neden bu bariz bir yol olabilir? Bu, bu yayında özetlenen geçerli uygulamadan daha kötü geliyor, bu da tüm varlıkları önceden yüklemenizi sağlıyor, böylece ihtiyaç duyduğunuzda hemen kullanılabilir olmalarını sağlıyorsunuz. Tek bir oyuncu oyunu için iyi olabilir, ancak birçok insanın oyun sırasında sürekli olarak yeni varlıkların indirilmesini beklemek zorunda kalmadan daha uzun bir kurulum süresi (ve daha fazla disk alanı kullanımı) tercih edeceğini düşünüyorum.
Anthony Grist

2
Çok oyunculu bir oyun için mi? Mutlak felaket. Diğer bir oyuncunun oyuna başlamak için beklemesini istemezsiniz çünkü bir kişinin şimdiye kadar hiç ihtiyaç duymadığı bazı varlıkları indirmesi gerekir.
Anthony Grist

1
@AnthonyGrist Bu yüzden efsaneler ligi gibi birçok oyun, bir maç bulmak için sıraya katılmadan önce bir oyuncunun tüm oyun varlıklarının indirilmesini gerektirir. Bu, büyük bir varlığın çalışmasını beklerken oyunun gecikmesinden çok daha iyi sonuç verir. Bu oyun türünde, oyuncuların pingte 10 ms'lik bir azalma üzerinde heyecanlandığını ve genellikle <50 ms'lik ping ile oynadığını ve bunun 100 ila 150 aralığına atlayıp atlamadığını söyleyebileceğini unutmayın. Bir oyun sırasında bir varlığı getirmeyi beklemek bir MOBA veya FPS'de bir felaket olur ve yanlış zamanda gerçekleşirse, oyunun sonucunu bile değiştirebilir.
JustWannaFly

@AnthonyGrist (devam) Sanırım böyle düşünebilirsin. Bazı çok oyunculu / rekabetçi oyunlarda, oyuncular bir müşterinin tüm güncelleme ve kuyruk girişlerine dikkat etmesini sağlayarak daha gerçek bir oyun oynama deneyimi için daha uzun bir yükleme / yama / kurulum süresi ticareti yaparlar. Bu, önceden yapılmış bir partiye katılmak istemedikçe sadece varlıklara ihtiyaç duyan belirli oyuncunun beklemesi gerektiğinden, partideki tüm oyuncuların rakipleri bulmak için sıraya girmek için beklemesi gerekir
JustWannaFly

1

Bu yerin bir örneği değil yapılan bu rakımı yaklaşık müşteri güvenilen Elder Scrolls Online idi zemin seviyesinde .

Altın madencileri yere birkaç adım düştü. Daha sonra arazinin "altında" dolaşabilirler ve PC'ler tarafından görülmeden veya NPC'ler tarafından saldırıya uğramadan kaynakları aşağıdan inceleyebilirler.

Benzer düzenlemeler uçurumları düzleştirmelerine izin verdi, böylece onları yürütebilir, statik duvarların altında kaldırabilir veya yönlendirebilir, tüm statik nesnelerden görebilirler.

Esasen, sunucu istemciye oynatıcının yeri konusunda güvenirdi, her bir oyuncu için sunucu tarafındaki çarpışmanın tüm statik değerlere karşı hesaplanması oldukça ağır olurdu.

Ancak Furcadia gibi karo tabanlı oyunlarda farklıdır: taşıdığınız her karenin sunucu tarafında yürünebilirliği vardır ve sunucunun herhangi bir şey için istemciye güvenmesi gerekmez: sunucu her hareketi ve kullanıcı eylemini bilir ve doğrular ve istemci eylemi yalnızca sunucu sonucu söylediğinde görüntüler.


1
TL; DR: Her zaman müşterinin yalan söyleme, hile yapma, çökme olduğunu varsayın . Ancak her şeyin sunucu doğrulaması kapasitenizi düşürür.
Draco18s artık SE
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.