-
Posts
696 -
Joined
-
Last visited
-
Days Won
17
Life Is Good's Achievements

Advanced Member (3/3)
91
Reputation
-
Ich hab mal ein wenig Code auf mein GitHub profil hochgeladen.
Simple, leichte und (relativ) saubere Implementationen von A* und Flow Fields pathfinding (bei A* fehlt noch ein kleines Video oder so...)
Mir ist aufgefallen, dass gerade zu A* ziemlich verwurstelte Code Beispiele bei Google rauskommen
Wen sowas interessiert, der kann ja mal reinschauen. Vielleicht schreib ich auch mal 'ne Tutorial oder so dazu.
A* https://github.com/GoGreenOrDieTryin/Unity-A-Star
Flow Fields https://github.com/GoGreenOrDieTryin/Unity-Flow-Fields-
Darf man Kritik äußern xD? Warum übergibst du den Start/Ende/Grid im Konstruktor. Jetzt musst du jedesmal ein neues A* Objekt erzeugen wenn du ne neue Suche machen willst...
Ansonsten wenn du mehr Performance haben willst nutz nen Heap. Der sorgt dafür das du nicht immer durch die ganze Liste iterierst wenn du den besten Knoten haben willst.
Aber ansonsten ne schön einfach zu verstehende A* Implementierung. Aber weil ich angeben will hier ist meine https://github.com/Djeurissen/SmartAI/blob/master/SmartAI/Search/AStarSearch.cs
-
-
1
-
- Report
-
Klar ! Es kann nie sauber genug sein
Dabei hab ich mir ehrlich gesagt nichts besonderes gedacht, einfach so simple wie möglich gehalten.
Eigentlich hätte ich start & ende auch einfach public machen können, um die dann über den Inspector zu zuweisen.Zum Speicher:
Absolut. Ich halt meistens bloß so viel wie möglich lokal. Wenn man daraus was größeres machen würde, könnte man allein dadurch noch gut was an Performance rausholen.Dein Code gefällt mir übrigens auch gut.
-
Muss ich doch Glatt mal Testen, Suche schon lange was gescheites^^ Meine versuche Schlugen leider fehl und ergaben das die KI 6754374 meter neben den Pfad rumm eierte^^
-
-
Ich bin mal ein wenig durch meinen Code gesprungen. An einer Stelle muss ich sehr häufig über eine kleine Anzahl an Elementen iterieren
Foo target; for (int i = 0; i < 4; i++) if (collection[i].flags == fooFlag) target = collection[i];
Ein ganz simples Stück Code also.
Linq sieht aber natürlich sehr viel hübscher aus, also hab ich statt des Oberen Schnipsels zu erst so was hier gemacht
var target = collection.First(e => e.flags == fooFlag);
Was ich beobachtet habe: Das 2. ist halb so schnell. Das sind 20ms, statt 10ms (wird jeden Frame aufgerufen, d.h. zweiteres erfüllt schonmal gar nicht mehr die 60hz Anforderung, was ja heute ziemlich standard ist.... Macht also viel aus !)
- Show previous comments 10 more
-
Ohh, bist du auf der aktuellsten Version ? Ich hab gehört dass das NavMesh mit der neuen Version ein wenig kaputt gegangen sein soll. Ich hab's das letzte mal vor nem Jahr oder so verwendet und da ging sowas noch.
-
Na, das Problem existiert zumindest seit Version 5.4.1. Ich muss es mal in Unity 2017 nochmal testen, aber glaube nicht, daß an der Ecke was passiert ist:
https://feedback.unity3d.com/suggestions/navmesh-agent-local-avoidance-recalculate-navmesh-path-when-another-agent-get-in-the-way
Wenn man mit einer handvoll Agenten hantiert, merkt man das Problem noch nicht unbedingt, da die local avoidance auf sehr kurzen "Ausweichpfaden" noch funktioniert (also wenn nur 2 Agenten aneinander vorbeilaufen sollen).
Ein typischer Testfall ist, du lässt 20 Agenten zu einen Ziel laufen (z.b. Spieler). Beim Unitynavmesh klumpen die Agents dann an einer Stelle vor dem Spieler (aus Laufrichtung) zusammen (und stapeln sich teilweise hintereinander auf). Eigentlich sollten aber die Agents den Spieler einkreisen. Gibt auch noch andere Probleme an engen Stellen auf dem Navmesh, wenn sich die Agents "treffen". -
Ich hab's bloß mit einer handvoll Agenten getestet also
¯\_(ツ)_/¯
-
Ich bin gerade dabei meinen Path Tracer auf die GPU zu porten, dabei ist mir was interessantes aufgefallen.
Ich hab den selben Code 2 mal mit bloß einem Unterschied:
Der eine ist rekursiv, der andere iterativ (da Recursion ja nicht so doll für GPUs ist)
Ansonsten hab ich nichts verändert !
Die Ergebnisse sind identisch.
Und jetzt kommts:
Der rekursive hat 10min und 11sek gebraucht, der iterative bloß 157sek.
Das ist ein Performance boost von etwa 390% !!
Skaliert wohl mit längeren Berechnungen noch mehr. -
Nach 3h debuggen den Fehler meines kleinen Path Tracers gefunden. Ich hab vergessen meine Vektoren im Default Constructor mit 0, 0, 0 zu initialisieren. Ich komm mir gerade verdammt blöd vor
- Show previous comments 1 more
-
Joa ich hab auch schon mal einen Abend und den halben nächsten Tag damit verbracht einen Bug zu suchen, weil ich eine Component am falschen GameObjekt angehängt hab.. Da kommt man sich echt dämlich vor ^^
-
Ist doch nice. Ist zwar erst einmal bicht so toll, aber aus solchen Fehlern lernt man am besten. Mir geht's zumindest so.
-
Jup, ist bloß etwas frustrierend, wenn man seinen Code wieder durchgeht und den Fehler nicht findet. Normalerweise hab ich so grob 'ne Ahnung was der Fehler ist