Thursday, April 20, 2017

Plan van aanpak

Plan van aanpak

Doel:
Een pathfinding algoritme maken in C# dat werkt in de Unity3D-engine, dat 4 verschillende items kan oppakken voordat het naar het eindpunt beweegt, terwijl het de kortst mogelijke route kiest.

Planning:
4 mei 2017:
Zonder bugs één item kunnen oppakken en dan naar de uitgang lopen.

11 mei 2017:
Twee vooraf bepaalde items kunnen oppakken en naar de uitgang lopen.

19 mei 2017:
Een lijst van 3 items ingeven, het algoritme zoekt een weg naar deze items en loopt naar de uitgang

23 mei 2017:
Een lijst van 3 items ingeven, het algoritme zoekt de kortste weg naar deze items en loopt naar de uitgang.

1 juni 2017:
Een onbeperkte lijst van items ingeven (boodschappenlijst?), het algoritme zoekt de kortste weg naar deze items en loopt naar de uitgang.

Thursday, April 13, 2017

Optimalisatie - Deel 3

De vorige keer kwam ik er achter dat het toevoegen van een tegel aan een List de bottleneck was van mijn applicatie. Daarom ben ik onderzoek gaan doen naar Lists in C#, en waarom ze zo langzaam zijn.

Ik stuitte op dit artikel: http://jacksondunstan.com/articles/3066
De schrijver had wat testjes gedaan met het schrijven en lezen van Lists en Arrays, en kwam tot conclusie dat Arrays vele malen sneller zijn dan Lists.



Dus toen besloot ik om de List te vervangen voor een Array. Ik voeg de tegel niet meer toe aan de List tijdens het creëren van de tegel, maar als alle tegels zijn gecreërd zoek ik alle objecten met de Tile-class en stop die in een Array.

Nu ga ik van 37 seconden naar 3.7 seconden voor het maken van een veld van 101x101 tegels!


Tuesday, April 11, 2017

Optimalisatie - deel 2

Bij velden groter dan 100x100 tegels duurde het erg lang om de applicatie te laden, en bij velden groter dan 250x250 tegels liep de applicatie vast. Dus om uit te zoeken waar dit aan lag ben ik gaan kijken hoe ik mijn for-loop kan optimaliseren.

Omdat bij het starten van de applicatie alles vastliep totdat het gehele veld was geinitialiseerd, ben ik gaan kijken of ik de tegels niet stukje voor stukje kon initialiseren, zodat de computer niet meteen vol op zijn donder krijgt.

Hiervoor ben ik gaan uitzoeken wat de volgorde van het uitvoeren van een script was, want ik wil dat eerst de absolute basis van de applicatie gestart is, voordat alle tegels worden toegevoegd. Ook moeten de tegels niet 100% van alle processorkracht opvreten, zodat de computer niet vastloopt of hangt.

Op de site van Unity stond gelukkig duidelijk uitgelegd wat de volgorde van een script in Unity is.

De functies die voor mij interessant zijn:

  1. Start() - In deze functie creeer ik alle tegels. Wordt 1x per script aangeroepen, als de applicatie wordt opgestart.
  2. Update() - Wordt ieder frame aangeroepen
  3. Coroutine() - Wordt ieder frame na de Update aangeroepen. Jij geeft aan wanneer dit start of stopt.

Ik besloot om de for-loop om tegels te creeren in een coroutine te zetten, zodat de applicatie eerst helemaal kan opstarten, en het visueel zichtbaar is hoe het veld van tegels wordt opgebouwd.

Hierdoor liep de computer niet meer vast bij grote aantallen tegels, maar de performance werdt niet beter. Daarom ben ik gaan uitzoeken waar de bottleneck nu zat, dit is te zien in het onderstaande filmpje:



Nu moet ik gaan uitzoeken hoe ik dit probleem ga overbruggen...