Voksel küpü manzaraları için bir ağı optimize etme


12

Unity 3D'de (yöntemsel olarak oluşturulmuş voksel manzaraları küplerle) minecraftish / lego dünya manzaraları yaratarak oynarken, bu manzaralar için oluşturulan kafeslerin bir sürü bellek aldığını görüyorum. Ağ şu anda sadece bir küpün görünür tarafları için köşelerden oluşmaktadır. Karmaşık bir arazi için bellek kullanımı 6 veya 7 yüz meg alabilir.

Bu kafesler optimize edilebilir, ancak bunu yapmak için iyi bir algoritma bulmak için mücadele ediyorum.

Algoritmanın, farklı arazi türlerinden blokları "birleştirmek" istemediğinizi dikkate alması gerekir. Gerçekten basit bir başlangıç, tüm blokları bir eksen boyunca işlemek ve diğer iki eksen için ekstra tarama yapmak olabilir.

Kafes şeklini korumam gerekiyor, bu da köşeleri boş veya katı alanın değiştiği noktaya birleştirmiyorum. Nedeni, hala örgü etrafında gezinmek gerekir yaratıklar / vb olabilir. Bu yüzden sadece çok düşük bir ayrıntı, çarpık bir kafes oluşturamıyorum.

Bu konuda herhangi bir düşünce / öneri / ipucu?


2
Neden bilinen bir boyut küpü için köşe saklıyorsunuz? Algorik olarak yapın; veya paylaşılan bir köşe arabelleği kullanın.
deceleratedcaviar

Neden çokgen örgü? Voksel olduğu gibi oldukça verimli bir şekilde oluşturulabilir . Bir voksel küp için 3 şamandıra (x, y, z) gerekir, 1 kutu için 8 * 3 şamandıra (8 köşe) gerekir ve örtülü kenarlarınız ve çokgenleriniz varsa. Belki Birlik bu voksel sorununun aracı değildir.
user712092

Yanıtlar:


5

Sorum şu:

Yaratık hareketi yapmak için neden ağın kendisine ihtiyacınız var?

Kimlik hesaplamasının 3d matrisinde yol hesaplamasını yapamaz mısınız?

Bence Minecraft 4 bit pr bloklu bir 3d matris kullanıyor. Ayrıca, yaratıklara oyuncunun etrafında belirli bir yarıçapı simüle eder.

Parçalarınızı, her bir parçanın sıkıştırıldığı bir ok ağacı yapısında saklayabilirsiniz.

Sıkıştırılmış verileri RAM'de tutarsanız, gerektiğinde verileri çok hızlı bir şekilde açabilirsiniz.

alternatif metin


Unity ile yerleşik çarpışma tespiti için ağa güveniyordum, ancak sadece özel bir veri yapısına karşı çarpışma / yol test etmemi engelleyecek bir şey yok. Ancak, hala araziyi görüntülemek için görünür bir kafes oluşturmam gerekiyor ve optimize etmek için ihtiyacım olan şey bu.
James Livingston

Bir başka nokta ... ekran görüntüsünde görebileceğiniz gibi ... bu arazide düz bir sürü yok. Ağlar genellikle küplerin pürüzlü yüzeyleridir, ancak ağ yüzlerini / köşelerini optimize etmek için biraz yer olduğunu düşünüyorum. Bir oktree, "jaggy" verileri yerine birçok benzer veri bloğuna sahip veriler için en iyisi gibi görünüyor. Yoksa bu doğru değil mi?
James Livingston

@Gatorfrog: Boş alanın da bir veri olduğunu unutmayın. eğer o zaman jaggy ise, boş olduğunu gösteren çok sayıda bit olacaktır. Oktree, onları oluşturmadan önce hangi parçaları açmanız gerektiğini anlamanız için sadece orada. Boş alan bir grup sıfır olacak. Benim dayjob çok sofistike bir voksel render kütüphanesi ile çalışmayı içerir. Bir sonraki yazımda ne yaptıklarını anlatacağım.
Nailer

Çalıştığım kütüphane aşağıdakileri yapar: Veri parçaları oluşturur ve bunları düz dosya veritabanında saklar. Her yığının bir kimliği vardır. Her küp birçok parçadan oluşur. Her yığın için belirli sayıda ayrıntı düzeyi oluşturulur. En yüksek ayrıntı seviyesi voksellerin% 100'üne sahip olduğunda, ikinci en yüksek seviye tüm voksellerin% 25'ine sahiptir ve daha sonra her bir seviye için 4'e bölünür. Yakınınızdaki topaklar en üst düzeyde ayrıntı kullanılarak görüntülenebilir.
Nailer

tüm veriler RAM'den VRAM'a sıkıştırılmış bir formda gönderilir ve burada CUDA'da çalışan GPGPU sıkıştırma algoritmaları tarafından şişirilir. Bu, çok fazla bellek bant genişliği tasarrufu sağlar. Yani: Oyuncunun nerede olduğunu kontrol edin ve orada yüksek düzeyde ayrıntı toplayın, en uzaktaki şeyler daha düşük LOD'lardan biri kullanılarak kolayca görselleştirilebilir.
Nailer

1

Araziyi saklamak için bir oktree kullanmaya ne dersiniz?

Örneğin hava = düğüm yok, diğer tüm arazi türlerinde arazi türüne sahip bir düğüm bulunur.

Düğümleri eklerken / çıkarırken, değiştirilmiş ağaç yolundaki her düğümün sekiz çocuğunun da aynı terain tipine sahip olup olmadığını kontrol edebilir ve gerekirse birleştirebilirsiniz. Bu şekilde, aynı malzemenin büyük blokları sadece bir düğümü alacaktı.


0

Küpleri yalnızca oynatıcının görebileceği geometrinin bölümleri için mi oluşturuyorsunuz? Bu benim ilk adımım olurdu. Arazinizin büyüklüğüne bağlı olarak dünyanın bütününün yüklü / çizim / görünür / ne olursa olsun olması gerekmez.


Sadece yanlarında boş hava olan küplerin kenarları için ağ oluşturuyorum. Oyuncunun göremediği kafesleri çizmediği sürece ... Yeraltı mağaraları veya bir açıyla zemine açılan delikler gibi görünür blokları olmayan herhangi bir parçayı hariç tutmayı düşündüm. Yine de, bu noktada çarpışma / yol için kafeslerime güvenemezdim.
James Livingston
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.