Ich hatte einige Probleme damit, effizient zu bestimmen, ob große Räume in voxelbasierten 3D-Räumen versiegelt sind. Ich bin an einem Punkt angelangt, an dem ich mein Bestes gegeben habe, um das Problem zu lösen, ohne um Hilfe zu bitten, aber nicht genug versucht habe, um aufzugeben, also bitte ich um Hilfe.
Zur Verdeutlichung versiegelt, dass es keine Löcher im Raum gibt. Es gibt Sauerstoffversiegelungen, die prüfen, ob der Raum versiegelt ist, und die je nach Sauerstoffzufuhr abdichten.
Im Moment mache ich das so:
- Beginnen Sie am Block über der Versiegelungskachel (die Entlüftung befindet sich auf der Oberseite der Versiegelung) und durchlaufen Sie rekursiv alle 6 benachbarten Richtungen
- Wenn es sich bei der angrenzenden Kachel um eine vollständige Kachel ohne Vakuum handelt, fahren Sie mit der Schleife fort
- Wenn die benachbarte Kachel nicht voll ist oder eine Vakuumkachel ist, überprüfen Sie rekursiv, ob es sich um benachbarte Blöcke handelt.
- Verringern Sie jedes Mal, wenn eine Kachel überprüft wird, einen Zähler
- Wenn der Zähler Null erreicht und der letzte Block neben einer Vakuumkachel liegt, geben Sie zurück, dass der Bereich nicht versiegelt ist
- Wenn der Zähler Null erreicht und der letzte Block keine Vakuumkachel ist oder die rekursive Schleife endet (keine Vakuumkacheln mehr vorhanden), bevor der Zähler Null ist, wird der Bereich versiegelt
Wenn der Bereich nicht versiegelt ist, führen Sie die Schleife mit einigen Änderungen erneut aus:
- Überprüfen benachbarter Blöcke auf "atmungsaktive Luft" -Fliesen anstelle einer Vakuumfliese
- Anstatt einen Dekrementierungszähler zu verwenden, fahren Sie fort, bis keine benachbarten "Atemluft" -Kacheln mehr gefunden werden.
- Sobald die Schleife beendet ist, setzen Sie jeden geprüften Block auf eine Vakuumkachel.
Hier ist der Code, den ich verwende: http://pastebin.com/NimyKncC
Das Problem:
Ich führe diese Prüfung alle 3 Sekunden durch. Manchmal muss ein Versiegeler Hunderte von Blöcken durchlaufen, und in einer großen Welt mit vielen Sauerstoffversiegelungen können diese mehreren rekursiven Schleifen alle paar Sekunden die CPU sehr belasten.
Ich habe mich gefragt, ob jemand mit mehr Erfahrung in der Optimierung mir helfen oder mich zumindest in die richtige Richtung weisen kann. Vielen Dank.