J'ai eu des problèmes pour déterminer efficacement si de grandes pièces sont scellées dans des pièces 3D à base de voxel. J'en suis à un point où j'ai fait de mon mieux pour résoudre le problème sans demander de l'aide, mais pas assez pour abandonner, alors je demande de l'aide.
Pour clarifier, scellé étant qu'il n'y a pas de trous dans la pièce. Il existe des scelleurs à oxygène qui vérifient si la pièce est scellée et scellent en fonction du niveau d'entrée d'oxygène.
En ce moment, voici comment je le fais:
- En commençant par le bloc au-dessus de la tuile de scellant (l'évent est sur la face supérieure du scellant), faites une boucle récursive dans les 6 directions adjacentes
- Si la tuile adjacente est une tuile pleine, sans vide, continuez à travers la boucle
- Si la tuile adjacente n'est pas pleine, ou est une tuile sous vide, vérifiez si ce sont des blocs adjacents qui sont récursivement.
- Chaque fois qu'une tuile est vérifiée, décrémenter un compteur
- Si le nombre atteint zéro, si le dernier bloc est adjacent à une tuile à vide, retournez que la zone est descellée
- Si le nombre atteint zéro et que le dernier bloc n'est pas une tuile à vide, ou si la boucle récursive se termine (plus aucune tuile à vide) avant que le compteur ne soit nul, la zone est scellée
Si la zone n'est pas scellée, exécutez à nouveau la boucle avec quelques modifications:
- Vérification des blocs adjacents pour la tuile "air respirable" au lieu d'une tuile sous vide
- Au lieu d'utiliser un compteur décrémentant, continuez jusqu'à ce qu'aucune tuile adjacente "air respirable" ne soit trouvée.
- Une fois la boucle terminée, définissez chaque bloc vérifié sur une tuile à vide.
Voici le code que j'utilise: http://pastebin.com/NimyKncC
Le problème:
J'exécute cette vérification toutes les 3 secondes, parfois un scellant devra faire une boucle à travers des centaines de blocs, et un grand monde avec de nombreux scelleurs à oxygène, ces multiples boucles récursives toutes les quelques secondes peuvent être très difficiles sur le CPU.
Je me demandais si quelqu'un ayant plus d'expérience avec l'optimisation peut me donner un coup de main, ou au moins me diriger dans la bonne direction. Merci beaucoup.