Ben şu görüşe katılıyorum: "kanıtlanmış bir mesele olmadıkça endişelenmeyin", erken düşünmeye değer olduğunu düşünüyorum: bir çözümün geriye dönük takılması çok daha acı vericidir. Ve evet, sadece 'yakındaki' fayans güncelleme onlar gitmek yoludur. Ancak, oyun dünyanızdaki öğelerin verimli bir şekilde depolanması ve adreslenebilirliği performans nedeniyle çok önemlidir.
Burada gerçekten düşündüğünüz seyrek bir veri kümesidir: potansiyel dizinlerin büyük (veya sınırsız) olduğu, ancak sadece küçük bir oranın gerçekte kullanıldığı bir şey. Kilit nokta, hangi oranın kullanılacağını tam olarak bilmemenizdir.
Seyrek veri seti problemine standart çözüm, indeksi / adreslenebilirliği gerçek veri deposundan ayırmaktır. Döşeme nesnesi pahalıysa, kompakt bir biçimde (örneğin düz bir dizi) saklayın. Ancak daha ucuz bir nesne ile dizine eklenmesine izin verin. En basit haliyle, bu, koordinatla kolayca indeksleyebileceğiniz bir 2D (veya 3D) matris olabilir, ancak matristeki her öğe basitçe bir endekstir. Daha sonra bu dizini, gerçek kutucuk içeriklerini ayrı, kompakt bir dizide aramak için kullanırsınız. Döşeme içeriği henüz yoksa, bunları dizinin sonuna ekleyin ve dizini 3D matrisinde saklayın.
İçeriklerin silinmesini desteklemek istiyorsanız (içerik dizisinin parçalanmasına yol açtığı için) çözüm daha karmaşık hale gelir ve karo içeriğiniz ucuzsa, dizinin ekstra ağırlığı (32 bit veya 64 bit indeksler) muhtemelen her bir potansiyel döşemeyi saklamaz. Ayrıca, önbellek performansınıza zarar verecek ekstra bir arama.
Ekstra dolaylı katmanlar ekleyerek daha fazla depolama verimliliği elde edebilirsiniz. Döşemelerinizi parçalar halinde düzenlediğinizi ve parçaların 64x64x64 boyutunda olduğunu varsayalım. 125, 1, 132'de bir karo verildiğinde, parçanın (1,0,2) olduğunu biliyorsunuz. Böylece, kompakt bir yığın dizisinden ve bir yığın indeks matrisinden oluşan bir dünyanız var (yığın yoksa -1). Her parçanın içeriği (varsa) 64x64x64 karo dizini matrisidir (karo henüz yoksa -1) ve kullanılan döşemelerin küçük bir dizisidir. Bu şekilde, asla kullanılmayan parçalar için büyük miktarda kiremit indeksi yakmazsınız. Bu tür bir yaklaşımı izleyerek ve yığın ayrıntı düzeyi için mantıklı sayılar seçerek, evreninizi büyük ölçüde ölçeklendirebilir ve bellek kullanımınızı kontrol altında tutabilirsiniz. Aslında, parçalarınızı 32x32x32 yaparsanız,
Ayrıca, özel bir şey ifade etmek için yığın veya karo dizinlerinizin yüksek dereceli bitini kullanmak gibi gizli hileler de yapabilirsiniz. Döşeme matrisindeki bir girişin üst biti ayarlanmışsa, daha düşük 31 bit bir döşeme dizini anlamına gelmez, bunun yerine bir 'çözgü endeksi' veya benzeri bir şey anlamına gelir ve bunu ayrı ayrı tutulan bir listede arayabilirsiniz. yol açtığı koordinatları bulmak için.