Yönetmeniz gereken iki farklı şey var:
Sunucu gerekir bir authorative şekilde, tüm dünyayı yönetmek. Bunun için, N müşterileri ile iletişim (N'nin "büyük" olduğu) gerekir.
Müşteri prensip olarak tüm dünyayı biliyor olabilirdi , ama buna ihtiyacı yok . Müşteri için, oyuncunun yakınında ne olduğunu bilmek yeterlidir. Örneğin oldukça kaba bir ızgara benzeri bölümleme olduğu varsayıldığında, sadece oyuncunun hücresini ve oynatıcının etrafındaki 26 hücreleri (veya 2B bir ızgaraya sahipseniz 8 hücreyi) bilmesi gerekir. Biraz daha ince bir ızgara daha iyidir, ancak fikri anladınız.
Şimdi, birçok alıcı, "çok" nedir? Saniyede belki 5 şey kazarsınız, bu belki de sunucuda güncellenmesi gereken iki düzine sayıdır ve sunucunun, ilgilendiğiniz alanı hücrenizle örtüşen başka bir oyuncuya iletmesi gerekebilir . Bir bilgisayar için bu oldukça saçma bir veri ve ihmal edilebilir bir hesaplama. Aynı hücrede yüzlerce / bin oyuncu varsa (o zaman ayrıştırma çok kaba) zor olabilir.
Sunucunun, alıcıların dönüşünü veya bu gibi ayrıntıları bilmesi veya umursaması gerekmez. Neden olsun ki?
Müşteri aslında umursamıyor, çünkü bu sadece müşterinin anında yapabileceği göz şekeri.
Sunucunun bakış açısından gerekli olan, içinde bulunduğunuz düğümde (30, 40, 50) kazı yaptığınızı bilmek ve bunun, örneğin 5 tipinde üç nesneyi ya da 7 tipinde bir nesneyi ortaya çıkardığına karar vermesidir. 3 sayısı. Tek umursadığı şey ve sana anlattığı her şey. Ayrıca, ilgilenilen alanını daha sonra şebeke hücresi üzerinde hareket ettiren birine gönderilen verilerde de bulunacaktır (o zamana kadar hala orada olduğunu varsayarak).
Müvekkilinin orada ortaya çıktığı üç nesneye söylendiğini söyledi. Şimdi, müşteri şimdi bir 'D' olan bir ASCII-sanat haritası görüntüler mi, yoksa dönen bir kir yığını mı gösterir, hepsi aynıdır. Kazıkların farklı dönmelere sahip olup olmadığı ya da sadece oynatıcınıza yakın olanların da dönüp dönmediği de aynıdır. Monitörünüzde görüntülenen şeyler yalnızca başkasını etkilemez.
Böylece, sadece yakındaki kir yığınlarını döndürmek istediğiniz somut durumda, bildiğiniz tüm cisimler üzerinde bir aralık kontrolü yapabilirsiniz. Veri seti büyük olmadığı için her şey için kaba kuvvet bile işe yarayacak.
Bölünme boyutunuza bağlı olarak (ve gerekir), çok uzaktaki ızgara hücrelerini önemsiz şekilde eritebilirsiniz.
Elbette, hücrenizi daha alt bölümlere ayırabilir ve süper zeki bir şey kullanabilirsiniz. İsterseniz kd-Tree kullanın, ancak büyük kazançlar beklemeyin. Manhattan distasından bir şeyler eritebilir veya bir şeylerinizi küçük bir ızgarada sıralayabilirsiniz… ama neden?
Bir mesafe kontrolü (gerçekten karesel mesafe, ancak sizin için aynıdır) sadece iki çarpma ve bir dallanma veya koşullu hareket izleyen bir toplama (MUL, MADD, yani gerçekten sadece iki işlem için optimize edilmiştir). Bu, bir seferde tüm ızgara hücrelerini budamayan herhangi bir işlem kadar hızlı. Aslında bu o şey olabilir hatta GPU yapmak ...
Aynı yüzeye karşı nasıl birkaç yüz veya en fazla birkaç bin mesafe kontrol edeceğinizi görünce (kare mesafe iyi çalışır), bu hesaplamayı yapmakta zorlanmayacaksınız. bitişik bellek üzerine dostça yineleme ve koşullu hareketlerle, bu ucuzdur. Gibi bir şey (sözde kodu) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. Bu, kare başına birkaç yüz değerden oluşan bir dizi üzerinde bir yineleme. Bilgisayar bunu yapmayı daha az umursamıyordu, bitişik yükler ve depolar, basit ALU, dallar yok ve sadece birkaç bin yineleme.
Bu (çoğa bire), sunucudakiyle aynı sorun sınıfına (çoğa çoğa) değil. Gerçekten, müşteri sorun değil.
minecraft:dirt
) ve bir sayı (30), böylece oyuncu onu almaya yetecek kadar yakın olduğunda, oyuncunun envanterine olabildiğince çok sayı ekler. Eğer oyuncu sadece 6 eşya için yer açarsa ve 30'luk bir yığın yerde kalırsa, oyuncu