У меня были некоторые проблемы с эффективным определением, запечатаны ли большие комнаты в трехмерных комнатах на основе вокселей. Я нахожусь в состоянии, когда я изо всех сил пытался решить проблему, не обращаясь за помощью, но недостаточно старался сдаться, поэтому я прошу о помощи.
Чтобы выяснить, запечатано, что в комнате нет дыр. Есть кислородные упаковщики, которые проверяют, запечатана ли комната, и запечатывают в зависимости от уровня входного кислорода.
Прямо сейчас, вот как я это делаю:
- Начиная с блока над плиткой герметика (вентиляционное отверстие находится на верхней поверхности герметика), рекурсивно проходите по всем 6 смежным направлениям
- Если соседняя плитка является полной, не вакуумной плиткой, продолжайте цикл
- Если соседняя плитка не заполнена или является вакуумной плиткой, проверьте, рекурсивно ли соседние блоки.
- Каждый раз, когда проверяется тайл, уменьшайте счетчик
- Если число достигает нуля, если последний блок находится рядом с вакуумной плиткой, верните, что область незапечатана
- Если счетчик достигает нуля, а последний блок не является вакуумным тайлом или рекурсивный цикл завершается (вакуумных тайлов не осталось) до того, как счетчик станет нулевым, область будет запечатана
Если область не запечатана, запустите цикл снова с некоторыми изменениями:
- Проверка соседних блоков на «воздухопроницаемую» плитку вместо вакуумной плитки
- Вместо использования уменьшающегося счетчика продолжайте, пока не будут найдены соседние плитки «дышащий воздух».
- После завершения цикла установите каждый отмеченный блок на вакуумную плитку.
Вот код, который я использую: http://pastebin.com/NimyKncC
Проблема:
Я запускаю эту проверку каждые 3 секунды, иногда охотнику на тюленей придется проходить через сотни блоков, и в большом мире со многими кислородными охотниками на тюленей эти множественные рекурсивные циклы каждые несколько секунд могут быть очень тяжелыми для процессора.
Мне было интересно, сможет ли кто-нибудь с большим опытом оптимизации помочь мне или, по крайней мере, указать мне правильное направление. Огромное спасибо.