He tenido algunos problemas para determinar de manera eficiente si las salas grandes están selladas en salas 3D basadas en voxel. Estoy en un punto en el que he hecho todo lo posible para resolver el problema sin pedir ayuda, pero no he intentado lo suficiente como para rendirme, así que estoy pidiendo ayuda.
Para aclarar, sellado siendo que no hay agujeros en la habitación. Hay selladores de oxígeno, que verifican si la habitación está sellada y sellan según el nivel de entrada de oxígeno.
En este momento, así es como lo estoy haciendo:
- Comenzando en el bloque sobre la loseta de sellador (el respiradero está en la cara superior del sellador), haga un bucle recursivo en las 6 direcciones adyacentes
- Si el mosaico adyacente es un mosaico completo sin vacío, continúe a través del bucle
- Si el mosaico adyacente no está lleno, o es un mosaico de vacío, verifique si sus bloques adyacentes lo están, recursivamente.
- Cada vez que se marca un mosaico, disminuya un contador
- Si el recuento llega a cero, si el último bloque está adyacente a una loseta de vacío, devuelva que el área no está sellada
- Si el conteo llega a cero y el último bloque no es un mosaico de vacío, o el ciclo recursivo termina (no quedan mosaicos de vacío) antes de que el contador sea cero, el área está sellada
Si el área no está sellada, ejecute el ciclo nuevamente con algunos cambios:
- Verificación de bloques adyacentes para la loseta de "aire respirable" en lugar de una loseta de vacío
- En lugar de usar un contador decreciente, continúe hasta que no se encuentren fichas adyacentes de "aire respirable".
- Una vez que finalice el ciclo, configure cada bloque marcado en un mosaico de vacío.
Aquí está el código que estoy usando: http://pastebin.com/NimyKncC
El problema:
Estoy ejecutando esta comprobación cada 3 segundos, a veces un sellador tendrá que recorrer cientos de bloques, y en un mundo grande con muchos selladores de oxígeno, estos múltiples bucles recursivos cada pocos segundos pueden ser muy difíciles para la CPU.
Me preguntaba si alguien con más experiencia en optimización puede echarme una mano, o al menos señalarme en la dirección correcta. Gracias un montón.