Herhangi bir yönde sonsuz büyüyebilen bir 2B döşeme haritasını saklamak için iyi bir düz dosya formatı nedir?


9

Gerektiğinde prosedürle oluşturulan içerikle otomatik olarak herhangi bir yönde genişleyecek basit bir harita motoru oluşturuyorum.

Harita verilerinin dikdörtgen bir alt kümesinin, haritadaki herhangi bir noktadan hızlı ve verimli bir şekilde yüklenebilmesi için 0,0 orijinale sabitlenmiş harita verilerini depolamanın iyi bir yolu nedir?

Belki farklı sektörlerde haritayı tıknaz ve sonra belirli bir sektörün dosyada nerede depolandığını belirlemek için bir tür başlık biçimi kullanmalıyım bir fikrim var. Bu iyi bir teknik mi yoksa bakabileceğim daha iyi, daha verimli teknikler var mı?

Yanıtlar:


7

Teorik olarak sonsuz miktarda veri için tek bir düz dosya kullanılmamasını tavsiye ederim.

Teorik olarak sonsuz miktarda veriye sahipseniz , rasgele erişime ihtiyacınız vardır ; bu, birden fazla dosya veya veritabanı - veya dosya sistemleri veya veritabanı tarafından zaten çözülmüş olan dizinleme sorunlarının yeniden çözülmesini içeren dizinlenmiş bir düz dosya biçimi anlamına gelir .

Parçalarınızı birden fazla dosyaya dağıtırsanız, (-110, 5000) parçasını almak sadece "% APPDATA% / game / map / -110 / 5000.dat" (veya isterseniz başka bir dosya adı) sıkıştırmaya başlayın). Veritabanları sadece bir sorguya ihtiyaç duyar. Bir öbekte veri yoksa, hiçbir şey depolayamazsınız. Tek bir düz dosya, yarasadan rastgele erişimin hızını ve rahatlığını sunmaz.

Rastgele boyuttaki tek bir dosyada, hızlı rastgele erişim için herhangi bir veri parçasının konumu için bir güvenceye sahip olmanız gerekir, bu da bir dizin kullanmak anlamına gelir (çünkü veri yığınlarınızdaki ham bir ikili arama performansı bozar ve "boş" noktalı dosya size Byte56 sorunu verir ). Bir indeksleme sistemi geliştirdiğinizde, ona verimlilik verin ve kendinize bir API yazın, dosya sistemi veya veritabanı gibi bir şey yeniden yarattınız. Aslında bunu yapmaktan bir şey kazanmazsanız, muhtemelen yatırıma değmez. Örneğin Steam, GCF / NCF dosya biçimlerinden büyük faydalar sağlar.

Kaydetmelerinizde biraz güvenlik istiyorsanız, bunu yapmak hala mümkündür. Örneğin, her bir tekli parçayı şifreleyebilirsiniz. Silinmelerini önlemek için mevcut kaydedilmiş verilere dayalı bir merkezi karınız olabilir. Kaydedilen veriler karma ile eşleşmiyorsa (ve programınız değişikliğe neden olmamışsa), bir yığın silinir.


4

En sık kullanılan çözüm, birçok dosyaya bölünmüş gibi görünüyor, ancak sorunuz yalnızca tek bir dosya anlamına geliyor. Bunun için tek mantıklı seçenek (bence), o tek dosyanın içinde çok basit bir dosya sistemini taklit etmektir. Aslında bunu yapmak çok da zor değil, ancak mümkünse birden fazla dosya kullanmayı düşünmelisiniz.

Bir dosyaya bağlı kalmanız gerekiyorsa, ext2 fs'den uygulamanız için ilham alabilirsiniz. http://en.wikipedia.org/wiki/Ext2 Bir oyun için basit bir FS uygulamak zorunda kaldığımda bazı iyi kararlar vermeme yardımcı olduğunu biliyorum.

Ama gerçekten, büyüyen herhangi bir harita için, genellikle her "erişilen" yığın için bir dosya kullanmak daha iyidir.


4

Sonsuz dünyalarla uğraşırken oyunum için bir parçalama sistemi uyguladım (onları saklayıp tutamayacağımdan emin değilim). Tek bir dosyayla kullanmak için, önce dosyaya bir bayt uzaklığı hesaplamak için yığının dünya konumunu kullandım. Bu, statik bir yığın boyutu veya en azından statik bir maksimum kabul eder. Ancak, kullanıcı bir süre bir yönde yönelecek olsaydı, bu dosya boyutu için oldukça seyrek olurdu, çünkü henüz oluşturulmamış büyük arazi alanları vardı, bu nedenle dosyada boş alanlar vardı.

Ayrıca iki dosya sistemi denedim. Bir dosyada "yığın konumu" ile "yığın dosyası ofseti" çiftleri haritası bulunur. İkincisi tüm parçaları tutar. Yeni bir yığın oluşturulduğunda, yığın dosyasının sonuna gider ve ofset pozisyon-> ofset dosyasında saklanır. Bu bir sürü parça vardı ve pozisyon -> ofset dosyasında ofset bulmak biraz zaman aldı bir sorun oldu. Uygulanabilir bulursanız, hızlı erişim için konum-> ofset verilerini yükteki bir karma haritaya yükleyebilirsiniz.

Şimdilik ikinci bir seçenek kullanıyorum, ancak performansın eksik olduğunu fark edersem başka bir şeye geçebilir. Belki bu bilgilerle size uygun bir şeyler yaratabilirsiniz. İyi şanslar!


Ben sqlite sqlite.org bakarak öneririz . Çok bağımsız, dizine alınmış, lekeler, vb işler. Bu, performans ve dosya "delik" adres yardımcı olacaktır.
Daniel Blezek
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.