Mam problemy z wydajnym określeniem, czy duże pokoje są szczelnie zamknięte w pokojach 3D opartych na wokselach. Jestem w punkcie, w którym starałem się jak najlepiej rozwiązać problem, nie prosząc o pomoc, ale nie starałem się wystarczająco zrezygnować, więc proszę o pomoc.
Aby wyjaśnić, zapieczętowany jest fakt, że w pokoju nie ma dziur. Istnieją uszczelniacze tlenowe, które sprawdzają, czy pomieszczenie jest uszczelnione, i uszczelniają w zależności od poziomu wejściowego tlenu.
Właśnie tak to robię:
- Zaczynając od bloku nad płytką uszczelniacza (otwór wentylacyjny znajduje się na górnej powierzchni uszczelniacza), rekurencyjnie wykonaj pętlę we wszystkich 6 sąsiednich kierunkach
- Jeśli sąsiadująca płytka jest pełną, nie próżniową płytką, przejdź przez pętlę
- Jeśli sąsiadująca płytka nie jest pełna lub jest płytką próżniową, sprawdź, czy sąsiednie bloki są rekurencyjne.
- Za każdym razem, gdy sprawdzany jest kafelek, zmniejsz licznik
- Jeśli liczba osiągnie zero, jeśli ostatni blok sąsiaduje z płytką próżniową, zwróć, że obszar jest otwarty
- Jeśli licznik osiągnie zero, a ostatni blok nie jest płytką próżniową lub pętla rekurencyjna kończy się (nie pozostały płytki próżniowe), zanim licznik wyzeruje, obszar jest zaplombowany
Jeśli obszar nie jest zamknięty, ponownie uruchom pętlę z pewnymi zmianami:
- Sprawdzanie sąsiadujących bloków pod kątem płytki „oddychającego powietrza” zamiast płytki próżniowej
- Zamiast używać licznika malejącego, kontynuuj, dopóki nie zostaną znalezione sąsiadujące płytki „oddychającego powietrza”.
- Po zakończeniu pętli ustaw każdy zaznaczony blok na płytkę próżniową.
Oto kod, którego używam: http://pastebin.com/NimyKncC
Problem:
Sprawdzam to co 3 sekundy, czasem uszczelniacz będzie musiał przejść przez setki bloków, a duży świat z wieloma uszczelniaczami tlenu, te wielokrotne pętle rekurencyjne co kilka sekund mogą być bardzo trudne dla procesora.
Zastanawiałem się, czy ktoś z większym doświadczeniem w optymalizacji może mi pomóc, a przynajmniej wskazać właściwy kierunek. Wielkie dzięki.