Oyuncu pozisyonu WoW gibi bir MMORPG'de ne tür bir değişken tipinde saklanır?


18

J.Carmack'in bunun hakkında hızlı bir şekilde konuştuğunu bile duydum ...

Bir yazılım, bir oyuncunun konumunu bu kadar büyük bir dünyada, bölgeler arasında yükleme yapmadan ve çok oyunculu ölçekte nasıl bu kadar doğru bir şekilde izleyebilir? Veriler net koddan geçtiğinde nasıl biçimlendirilir?

Köşelerin grafik kartının belleğinde nasıl saklandığını anlayabiliyorum, ancak çok oyunculu senkronizasyon söz konusu olduğunda, neyin en iyi olduğunu hayal edemiyorum.

Yanıtlar:


26

Scott Bilas, Dungeon Siege üzerinde çalıştı ve "Zindan Kuşatması Sürekli Dünyası" adlı bir makale yazdı . Dungeon Siege bir MMO olmasa da, bir dünyası var ve oyuncunun makalesinde konumlandırmasından bahsediyor. Harika bir okuma buldum. İlgili bölüm:

Hassasiyet Sorunu

En başından beri, mühendislik ekibi sürekli dünyanın motor ve içerik tasarımını önemli ölçüde etkileyeceğini biliyordu ve asıl mesele sayısal kararlılıktı. İki karakter arayla doğuda başlayarak doğuya doğru ilerleyen iki karakterin hayal edin. Bir noktada, birbirlerine olan uzaklık, başlangıç ​​noktasına olan mesafeden çok fazladır ve karakterler “aynı konumda” görünecektir.

Kayan nokta ile, menşeden ne kadar uzaklaşırsanız, o kadar çok hassasiyet kaybedersiniz, bu da her türlü kötü soruna neden olabilir. İşler doğru sıralanmaz, bitişik ağlar arasında çatlaklar ortaya çıkar, alan ölçülmeye başlar ve kediler ve köpekler birlikte yaşamaya başlar. Dungeon Siege, belirgin performans avantajları ve video donanımının doğal hassasiyetiyle eşleşmesi için FPU'yu tek hassasiyet modunda kullanır. Bununla birlikte, hassasiyeti artırsak bile, sonuçta problemi asla çözemezdi çünkü dünya inanılmaz derecede büyük olması planlandı ve sonuçlandı.

Kesinlik sorunu, diğer oyunların çoğunda olduğu gibi birleşik bir dünya koordinat alanına sahip olmanın mümkün olmadığı anlamına geliyordu. Bunun yerine, çözüm sürekli dünyayı bir dizi bağımsız koordinat alanına ayırmak ve hassasiyeti sıfırlamak için periyodik olarak aralarında geçiş yapmaktı. Bu kısıtlamalar dahilinde çeşitli fikirler denendi ve sonunda standart bir portal sisteminin bir varyasyonuna karar verdik.

Çözümümüz, her bir geometri yığınının (Siege Node) kendi koordinat alanına sahip olduğu ve bu komşularla ortak olarak paylaştığı kapılar aracılığıyla komşu geometriye mekansal olarak bağlı olduğu ilişkisel düğüm tabanlı bir koordinat sisteminden oluşur. Kapılarla birbirine bağlanan düğümlerin düzenlenmesi, tüm dünya haritasını temsil eden sürekli bir grafik oluşturur. Bu düğüm sistemi, zaman içinde FPU hassasiyetini sürdürme konusundaki orijinal amacından, alanı verimli bir şekilde alt bölümlere ayırmanın ve sayısız optimizasyonun kökü haline gelmek için gelişti.

3B konum kavramını belirli bir düğüme göre kapsüllemek için geleneksel (x, y, z) vektörü bir düğüm kimliği (x, y, z, düğüm) ile arttırılmalı ve başlangıç ​​noktasından bir ofseti temsil etmeliydi belirli bir düğümün Bu 4 demet Kuşatma Düğümü Konumu veya SiegePos olarak kapsüllenmiştir. Daha sonra, düğümler arasındaki yönelimler arasındaki karşılaştırmaları işlemek için bir SiegeRot (kuaterniyon, düğüm) ekledik.

“Dünyada yer yok” ifadesi takıma bir mantra oldu, ancak kelimenin tam anlamıyla herkesin ne anlama geldiğini tam olarak anlaması yıllar sürdü.

Burada Dungeon Siege ile ilgili daha fazla makalesini görebilirsiniz .


Bu çok iyi bir cevap gibi görünüyor! Teşekkürler ! Bugünkü oyunun gmp tamsayıları gibi uzuvlu sayıları kullanıp kullanmayacağını merak ederdim.
jokoon

3

Büyük, imarsız bir dünya için ya çift kesinlikli bir tepe noktası ya da toprağı bölen daha küçük parçalarla kayan bir noktaya giderdim.

Her yığın kendi koordinat sistemine sahip olacaktır. Sınırı bu parçaların her birine geçtiğinizde, her şeyi bu koordinat sistemine dönüştürürsünüz. Zaten uçuş sims bu şekilde yaparlar.

Küçük bölgeleriniz varsa, sanırım şamandıra yeterli olacaktır.


Çift hassasiyet hızlı bir şekilde büyük performans ve bellek avantajlarına neden olur. (x, y, z, bölge) 16 bayttır; (x, y, z) iki katı en az 24 olur. Onlara hızlı matematik yapamazsınız ve bunları grafik kartında kullanamazsınız.

Fermi kartları çift kesinlik kullanabilir;) Ama evet, parçalı yaklaşım cevabın zaten önerdiği şeydir.
Nailer

2

Bir gerçek konum için 3 şamandıra bir vektör olduğunu söyleyebilirim. Ancak, oynatıcıyla ilişkili bir bölge endeksi de olacaktır. (Ancak bu bölge sunucusunun işlediği her şey aynı bölgede olduğundan ve aynı veri yapısında olması gerekmediğinden konumun bir parçası değildir.)

En az 4 bölge olduğunu unutmayın. 4 büyük kıta. Bunlardan herhangi birinin bir tarafta yaklaşık 10 km'den fazla olduğunu düşünmüyorum. Örneğin, bu blog öncesi en son genişleme tüm seyahat edebilen alanı 41 mil kare olarak hesaplar. Tüm savaş meydanları, tüm örnekler, her biri kendi bölgesinde ve koordinat alanında.

LUA API'sını kullanarak GetPlayerMapPosition () oynatıcının konumunu tüm dünya haritası boyunca bir oran olarak 0'dan 1'e kadar iki şamandıra döndürür.


1

WoW için, basit bir x / y / z şamandıra kullanmasını bekliyorum - ancak belirli bir 'bölgeye' göre

Bu, örneğin tekneler ve zeplinler gibi 'hareketli bölgelerin' ele alınmasına yardımcı olur


1

Genellikle Wow, Tibia vb. Gibi çevrimiçi oyunlar. Oyuncu pos. SQl oynatıcı meta tablosunda üç değişken X + Y + Z kullanarak. Runescape bunu Z olmadan yapar - bu şekilde oyuncu her zaman zemin ağının üstünde oluşturulur.


meta tablo nedir? Gerçekten bir DB saklayacağından şüpheliyim, gerçek zamanlı olarak kullanılması gerekiyor ...
jokoon

(1) Bu durumda meta tablo, temel karakter verilerine sahip DB tablosudur, örn. Cinsiyet, pozisyon xyz, sağlık miktarı, bankada nakit vb. Ve başka ne olabilir. (2) Açık Tibia sunucularını barındırıyorum, orada oyuncu pos sunucu önbelleğinde saklanıyor. Ama ... her 30 saniyede bir sunucu kaydediliyor ve oyuncunun POS'u Oyuncular meta verilerine eklenecek. Eğer sunucu kapanırsa / çökerse oyuncuların konumu DB pozisyonuna geri dönecektir :)
Mikolaj Marcisz

-2

Su üstünde? Peki, 3B bir dizi bir 3D oyun için yüzer. En azından bizim için ayakları birim olarak kullanıyoruz, bu yüzden ihtiyacınız olan tek şey şamandıra gürültüsünün sorun olmadığı noktada olmak üzere 3-4 ondalık basamak. Büyük bir bölge bir tarafta sadece bir ya da iki mil ise, o kadar da büyük bir anlaşma değildir. MMO'larda şeffaf bölgelere gelince, bu tamamen farklı bir soru. Bir MMO'daki zor problemlerin büyük şemasında, listede saklama pozisyonu oldukça düşüktür.


Geliştirme sırasında bazı büyük STO bölgelerinde kayan nokta hassasiyeti sorunları yaşadık. Onlara ne olduğunu bilmiyorum. Öncelikli olmayabilir, ancak gerçekte seviyeler oluşturacak kadar erken düşünülmesi gerekir.
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.