Yanıtlar:
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.txt
iç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.
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.
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.
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.