Edit: Bu sadece kendi öğrenme deneyimim için, bu soru sormak performans nedenleriyle DEĞİLDİR.
Bu, Minecraft benzeri bir arazi motoruyla ilgili. Blokları parçalar halinde saklarım (16x256x16 blokları bir yığın halinde). Bir yığın oluşturduğumda, araziyi ayarlamak ve nesneleri yerleştirmek için birden fazla yordamsal teknik kullanıyorum. Üretirken, tam yığın için bir 1D dizisi (katı veya değil) ve katı blokların ayrı bir 1D dizisi tutuyorum.
Nesilden sonra, komşularını kontrol eden katı blokları yineliyorum, böylece sadece katı komşuları olmayan blok yüzleri üretiyorum. Hangi yüzleri kendi listelerinde oluşturacağımı saklıyorum (6 liste, olası yüz / normal başına bir tane). Bir yığın oluştururken, kameranın geçerli yığınındaki tüm listeleri ve yalnızca diğer tüm parçalardaki fotoğraf makinesine bakan listeleri oluşturuyorum. Bunu 6 listenin tümünü tek bir arabellekte saklayarak yaparım, sonra çizdiğim aralıkları değiştiririm.
Andrew Russell'ın önerdiği bu küçük gölgelendirici hile ile 2B atlas kullanarak , benzer yüzleri tamamen birleştirmek istiyorum. Yani, aynı listede yer alıyorlarsa (aynı normal), birbirlerine bitişik, aynı ışık seviyesine sahipler, vb. Hala dikdörtgenlerle sonuçlanacağımı biliyorum, ancak köşe sayımı% 50 oranında kolayca azaltmalıdır. veya tahminlerim doğru ise daha iyi olur.
Benim varsayım 6 listenin her birinin üzerinde durdukları eksene göre, daha sonra diğer iki eksene göre sıralanması olacaktır (bir bloğun üstündeki liste Y değerine, sonra X, sonra Z'ye göre sıralanır).
Bu tek başına, yüz şeritlerini kolayca birleştirebilirim, ancak mümkün olduğunda sadece şeritlerden daha fazlasını birleştirmek istiyorum. Bu açgözlü ağ algoritmasını okudum , ama bunu anlamakta çok zorlanıyorum.
Yani, sorum: Açıklandığı gibi yüzlerin birleştirilmesini gerçekleştirmek için (dinamik arazi / aydınlatma için kötü bir fikir olup olmadığını göz ardı etmek), belki de uygulanması daha basit bir algoritma var mı? Ayrıca, beni açgözlü algoritmadan çok daha basit bir şekilde (bir bağlantı veya açıklama) yürüyen bir cevabı da memnuniyetle kabul ediyorum.
Uygulaması daha kolaysa veya sadece şerit yapmaktan biraz daha iyi olsa bile, performansta hafif bir düşüş umursamıyorum. Çoğu algoritmanın dörtlü yerine üçgenlere odaklandığından ve bir 2D atlas'ı benim gibi kullandığımdan endişeleniyorum, mevcut becerilerime dayalı bir üçgen uygulayabileceğimi bilmiyorum.
PS: Ben zaten yığın başına frustum cull ve açıklandığı gibi, aynı zamanda katı bloklar arasında yüzleri cull. Henüz tıkanıklığı yok ve asla yapamam.
* Düzenleme: Muhtemelen bir adı olan kendi küçük tekniğimi uyguladım, ancak sadece dinledikleri eksenlere, ardından blok tipine ve ardından aydınlatma seviyesine göre sıralanmış 6 listemden geçiyorum. Onları yineliyorum, aynı anda yeni dikdörtgenler yaratıyorum ve aynı anda büyütüyorum (belirli bir eksene doğru ağır bir önyargı ile). Kesinlikle optimal değil, ama gerçekten oldukça hızlı ve tepe sayımı ortalama% 50'ye kadar düşürüyor. Byte56'nın yorumu gerçek bir cevabı düşündüğüm dolap, ama cevap / ödül için bunu seçemiyorum.
İşte benim hızlı ve basit bir şekilde herhangi bir optimizasyon olmadan tam ilk arazi ürettikten SONRA bu sorunu ele alıyorum. Verilen tüm kareler aynı görüntü, ışık seviyesi, normal vb. Varsayarsak, her renk farklı bir dörtlüdür. Listelerim sıralandığı gibi, bu çok kolay / hızlı bir yaklaşımdır.