Bir MMO'daki oyuncuların gerçek zamanlı pozisyonlarını nasıl izlemeliyim?


14

MMORPG'deki oyuncuların pozisyonlarını nasıl takip ediyorsunuz? Bir veritabanı kullanabileceğinizi veya koordinatları dosyalarda saklayabileceğinizi okudum. Bir veritabanı kullanmayı denedim ama yavaştı. Dosyalar, oyuncuların pozisyonlarını takip etmek için nasıl kullanılabilir?

Yanıtlar:


23

Dosyalar, oyuncuların pozisyonlarını takip etmek için nasıl kullanılabilir?

Oynatıcı konumunu dosyaya yazarsınız. Örneğin, her oynatıcıyı benzersiz bir numarayla (veya bir GUID ile) tanımlarsanız, bunu dosya adı olarak kullanabilirsiniz. Dosyada, konum verilerini daha sonra ayrıştırabileceğiniz bir biçimde yazın. Örneğin, # 467239 numaralı oyuncunun bu ( x, y, z ) konumunda olup olmadığını 467239.txtiçerebilir .20, 3, 19

Bu, bir veritabanı ile yaptıklarınızdan farklı değildir, ancak - bir veritabanı bu işlemde "yavaş" olmamalıdır, çok hızlı olmalıdır (muhtemelen dosyalardan daha hızlıdır, çünkü daha fazla disk GÇ yükü veya GÇ kilitleme vardır çekişme - dosya başına birden çok konum depoladıysanız - dosya sistemi tabanlı bir yaklaşımda).

Belki de yürütücü konumunu çalışma zamanında saklamak için DB veya dosya sistemini kullanmaya çalışıyordunuz ? Bunu hiç yapmamalısınız .

Çalışma zamanında, sunucunuzda, oyuncu pozisyonları hafızada tutulmalı ve diğer oyunlarda olduğu gibi orada güncellenmelidir. Periyodik olarak diske veya başka bir kalıcı depoya kaydedilebilir - örneğin, oynatıcı dinlendiğinde, kaydedildiğinde veya oturumu kapattığında.

Ancak her oyuncunun pozisyonunu her güncellemeye depolamak gereksizdir ve son derece verimsizdir; "büyük" oyuncu ölçeklerine benzeyen hiçbir şeyle başa çıkmak için asla hızlı olamayacak.


1
Evet, aslında, bir postgreSQL için oyuncu pozisyonunu çalışma zamanında kaydediyordum. Ancak, sunucu belleğinde saklarsam, istemcilerdeki konumu nasıl güncelleyebilirim?
Baccari

12
İstemcinin güncellenme yöntemi her durumda aynıdır: sunucu istemciye bir ağ iletisi aracılığıyla konumunun ne olduğunu söyler (veya daha gerçekçi olarak, yerel tahmin yapan istemcinin yerel bir konumu vardır) sunucu istemciyi doğrular ve onaylar). İstemcinizin, sunucunun eriştiği veritabanına erişmesine izin vermemelisiniz.

1
"Bir dosya ile yap" demeye ilişkin noktayı özlüyorum, sadece db'yi kullanmaktan ve daha sonra gerçek sorunun hangisi olduğunu açıklamaktan daha kötü olduğunu açıklamak için. Neden işe yaramaz dosya açıklamasına ihtiyacınız var? Sadece sıradan okuyucuyu karıştırır, kimseye faydası olmaz.
o0 '.

6
Geçmişteki tecrübelerim, doğrudan soruları görmezden gelmenin ve sadece "doğru yol" olarak düşündüğüm şey hakkında konuşmaya devam etmenin daha çatışmacı olma eğiliminde olması ve OP'yi daha zayıf temelden uzakta asıl sorularının yönlendirilmesine daha az açık hale getirmektir. gelen, hepsi bu.

13

Konum , kullanım sırasında RAM'de olmalıdır . (ör: oyuncunun karakteri dünyada) DB'yi işletim belleği olarak kullanamazsınız. Evet, ama bu korkunç olacak.

Pozisyonları düzenli olarak kaydetmelisiniz, ancak her değiştiklerinde kaydetmemelisiniz.

Ayrıca tüm pozisyonları aynı anda kaydetmekten de kaçınırım. Bir sunucu çökmesi durumunda kalıcılığı korumak istiyorsanız, pozisyonu mümkün olduğunca sık, ancak oyunun boş zamanlarında kaydetmelisiniz. Bunu toplu olarak yapın.

Boş zaman varken 30 pozisyondan tasarruf edin.

Müşteriler gelince. Sunucu yazılımınıza bir bağlantı yoluyla (ilgili) oyun durumu güncellemeleri almalıdırlar. DB'den değil ... Bu pratik, yavaş, kötü, kötü ve güç rahatsız olurdu.


2
Ve evet, veritabanının oyun döngünüzün geri kalanını engelleyebileceği durumlardan kaçınmak için ayrı bir iş parçacığı kullanın.
Coyote

4

Ben her 500 kadar oyun keneler dosyalara kaydetmek için sıraya ayrı bir iş parçacığı var. Aksi takdirde, her şeyi RAM'de saklamalısınız.


4

Sunucumda yaptığım şey, oyuncuların yönünü (vektör) ve son pozisyonu saklamaktır, eğer oyuncunun bir hızı varsa, oyuncuların yeni pozisyonunu her 2 saniyede bir hesaplıyorum.

İstemcinin kendi konum konumu elbette ve sunucuya yeni bir yön (vektör) gönderir.

Sunucu konum hakkında yetkilidir ve istemci son kontrolden bu yana belirli bir mesafeyi hareket ettirirse bir konum paketi gönderir (bu, lastik bant efektinin istemcinin senkronizasyonu olmamasına neden olabilir).

Bütün bunlar elbette anılarda gerçekleşir.

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.