Çok oyunculu alan ayırma için verimli çözüm mü?


10

Bu soru biraz zor, ama açıklığa kavuşturmaya çalışacağım.

Bir çevrimiçi oyun (MMO ölçeği değil) oluşturduğumu, ancak yetkili bir sunucu yaklaşımında mümkün olduğunca çok oyuncuyu desteklediğimi varsayalım. Gerçekten istediğim büyük olan dünyalar sürü AI simüle düşman.

Alanı alt bölümlere ayırarak ve işlemeye gerek olmayan şeyleri işleyerek sunucu CPU'yu kurtarmak için birkaç stratejinin farkındayım. Dünyayı, yerel olarak (yalnız veya hatta birkaç arkadaşla) oynarken oyun kalitesini korumak için önemli olduğunu düşündüğüm, yükleme süreleri ve küçük geçişler gerektiren bölgelere ayırdım. Oyuncuların birden fazla veya iki bölgede olmasını beklemiyorum.

Sorun şu ki, bir bölge oldukça büyüyebilir ve aynı anda simüle eden çok sayıda NPC'ye sahip olabilir. Oyuncuların deneyimini etkilemeden bunu nasıl ele alırım? Bölge başına bir sunucu ve benzerleri gibi yaklaşımlar tabloda yer almamaktadır.

Esas olarak düşman ordularını ve hatta barışçıl NPC'leri barındıracak veri yapıları arıyorum. Soruyu sonuçlandırmak için, araçların var olduğunu, bu nedenle bir bölge içinde seyahat etmenin oldukça hızlı olduğunu ve cull bölgelere "ne zaman" etkilediğini unutmayın.


Yalnızca bir fiziksel sunucuyla sınırlı mısınız?
Patrick Hughes

Sonuçta, hayır. Ama hem basitlik hem de başarı için, şu an için projeyi daha da karmaşık hale getiremem :)
Grimshaw

Basit başlayın. "Sunucu" başına birden fazla fiziksel kutuda çalışan WoW gibi bir şey, dünyalarını bir ızgaraya böler ve tüm güncellemeler sizinle aynı kutularda kimin olduğuna dayanır. Çok basit, kolay ayar, iyi çalışıyor ve işlemeyi kontrol etmek için sadece bir kutunuzla kullanabilirsiniz.
Patrick Hughes

Bakış açınıza tamamen katılıyorum ve belki de sorumda bir şey kaçırdım. Kutunun hücresinin en sağında bir oyuncu ve sağ komşu hücrenin en solunda başka bir oyuncu varsa ne olur? Birbirlerini görmeliler! Dünya görünüşü WoW gibi bir oyun için devam ediyor .. Bunu anlamadım, verimli tutarken sürekli bir dünya ızgarası nasıl yapılır? Kesinlikle iki "sunucu" dan oyuncuların birbirini görmesi gereken durumlar vardır :)
Grimshaw

1
Ve evet, eğer her ikisinde de çok fazla şey olacaksa ve her yerinizde çok sayıda oyuncu varsa, her şeyin her yerde ve her zaman aktif olmasını planlamak zorundasınız, bunun etrafında sihirli bir yol yok. Bu nedenle, bir MMO sunucu grubunun tek kutuları en fazla 200-500 oyuncuya hizmet verir ve NPC'ler için MMO AI neden aptalca (hesaplamak ucuzdur).
Patrick Hughes

Yanıtlar:


5

Anladığım kadarıyla, sunucunuzda çalışan bir tür fizik olacak.

Bu durumda, yapay zeka / fizik için uzay bölümleme dışında başka teknikler de vardır. Çoğundan daha az belirgin:

  • öncelik: Oyuncularla doğrudan etkileşimi olmayan NPC'ler yenileme hızlarını düşürerek daha az CPU zamanı alabilir. Öncelik kuyruklarını kullanabilir ve ilk sıradan son sıraya kadar daha yüksek önceliğe sahip kuyrukları çalıştırabilirken, diğer sıralar her döngüde kuyruğun yalnızca 1/2, 1/4 veya 1/8'ini çalıştıracaktır. bu şekilde her nesnenin bir noktada çalışmasını sağlarsınız, ancak CPU kullanma sayısını azaltırsınız.
  • fizik de indirilebilir (sadece çarpışma kutuları ve küreler dolaşım sırasında ve görüş alanından uzakta kullanılabilir).
  • oyuncular uzaktayken NPC'lere ve çevreye çok temel davranışlar tahsis ederek AI / simülasyonu basitleştiriyor. Genellikle avlanmak, toplanmak, çiftçilik yerine düşmanları dolaşmak veya taramak olacaktır ...
  • bazı fizik ve yapay zeka da müşterilere devredilebilir. Sunucularda gerçekten CPU yoksa, nesneyi kısmen çözülmüş olarak etiketleyebilirsiniz ve istemciler bu nesnelerin fiziğini ve konumunu yerel olarak ayarlar (kayan NPC'leri önlemek için). Müşterilere AI çalıştırma konusunda bazı sorumluluklar verilebilir (bir oyuncuya karşı mücadele sırasında hedeflenen oyuncunun cihazı saldıran NPC'leri doğrudan çalıştırıyor olabilir)
  • oyuncular için, fizik sunucu üzerinde de düşürülebilir ve müşteriler çarpışma çözümlemesinde daha fazla sorumluluk alır. Örn: aracınızla bir nesneye çarptıysanız, sunucu yalnızca çarpışma kutularındaki çarpışmayı çözecek ve nesneleri çarpışma durumunda olduğu gibi etiketleyecektir. İstemci, çözünürlüğü sunucuya nesneler etiketlendiğinde ve çözüm doğru görünüyorsa kabul edecek bir zaman damgası ile gönderir.

Bu mekanizmaları uyguladıktan sonra, ne kadar ve ne sıklıkta ihtiyacınız olduğuna karar verebilirsiniz. Bunun en güzel yanı, daha sonra istemci uygulamaları yerine bazı görevleri üstlenebilecek birkaç sunucu ekleyebilmenizdir.

Tabii ki yaklaşık çarpışma tespiti bazı sapmalar yaratacaktır, ancak zaman zaman daha fazla hassasiyet ekleyerek bunları çözebileceksiniz.

Ayrıca fizik ile ilgili bir sunucuya erişiminiz varsa OpenCL veya CUDA gibi bir çeşit GPGPU sistemini destekleyen kütüphanelere bakmalısınız .


Bir bölgenin alan ayrıştırmasını öncelikli güncellemelerle birleştirmek, tam olarak ihtiyacım olan şey olmalı, az miktarda oyuncu için en uygun olanı olmalı ve birçok alan yüklendiğinde yine de optimize edilmelidir. Teşekkürler.
Grimshaw

@DevilWithin Yardımcı olmalı ve istemci tarafında herhangi bir değişiklik gerektirmez. Ayrıca cevaba birkaç ayrıntı daha ekledim.
Coyote

Basitleştirilmiş AI harika bir fikir. NPC oyunculardan uzak olsa da, çoğu durumda hareket etmekten başka bir şey yapmaları gerekmez. Bu, onların ne yaptıklarına, her 1 dakikada bir veya yaklaşık bir şey yapabileceğimi, sadece onları dünya çapında dolaşmak için yapabileceğim anlamına geliyor.
Grimshaw
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.