У мене виникли проблеми з ефективним визначенням того, чи великі приміщення запечатані в 3D-кімнатах на основі вокселів. Я в той момент, коли я намагався найсильніше вирішити проблему, не просячи допомоги, але недостатньо намагався відмовитись, тому я прошу допомоги.
Щоб уточнити, запечатано те, що в кімнаті немає дірок. Є кисневі ущільнювачі, які перевіряють, чи приміщення герметичне, і герметизують залежно від рівня введення кисню.
Зараз я це роблю:
- Починаючи з блоку над плиткою ущільнювача (вентиляційний отвір знаходиться на верхній стороні ущільнювача), рекурсивно прокручуємо через усі 6 суміжних напрямків
- Якщо сусідня плитка - це повна, не вакуумна плитка, продовжуйте через петлю
- Якщо сусідня плитка не є повною чи вакуумною плиткою, перевірте, чи є сусідні блоки, рекурсивно.
- Кожен раз, коли перевіряється плитка, зменшуйте лічильник
- Якщо кількість досягне нуля, якщо останній блок примикає до вакуумної плитки, поверніться, що область не запечатана
- Якщо підрахунок дорівнює нулю, а останній блок не є вакуумною плиткою, або рекурсивний цикл закінчується (не залишається вакуумних плиток) до лічильника дорівнює нулю, область запечатується
Якщо область не запечатана, запустіть цикл знову з деякими змінами:
- Перевірка сусідніх блоків на плитку "дихаючого повітря" замість вакуумної плитки
- Замість використання лічильника, що зменшується, продовжуйте, поки не знайдеться сусідня плитка "дихаючого повітря".
- Після завершення циклу встановіть кожен перевірений блок на вакуумну плитку.
Ось код, який я використовую: http://pastebin.com/NimyKncC
Проблема:
Я перевіряю цю перевірку кожні 3 секунди, іноді ущільнювачеві доведеться перебирати сотні блоків, і великий світ з багатьма кисневими ущільнювачами, ці багаторазові рекурсивні петлі кожні кілька секунд можуть бути дуже важкими для процесора.
Мені було цікаво, чи може хтось із більшим досвідом оптимізації подати мені руку чи принаймні вказати на мене в правильному напрямку. Дякую купу.