feat: last changes for documentation

This commit is contained in:
Sara Gerretsen 2025-10-28 23:00:20 +01:00
parent 0affb60ae1
commit 0bcb4ce4b1
2 changed files with 19 additions and 11 deletions

View file

@ -2,14 +2,26 @@
## Spatial Hashing
In 2d, de meest efficiente spatial-hashing strategie is vlakkenverdeling. Het is simpel voor hashing en hash searches om een ruimte op te delen in gelijkmatige vlakken.
In 2d, is de meest efficiente spatial-hashing strategie vlakkenverdeling. Het is simpel voor hashing en map searches om een ruimte op te delen in gelijkmatige vlakken.
Voor hashing moet een datastructuur worden teruggebracht naar een nummer. Mijn implementatie verdeeld een 8-bit unsigned int over 2 delen, de meest significante 4 bits worden gebruikt door de x coordinaat, en de minst significante 4 de y coordinaat.
Voor hashing moet een datastructuur worden teruggebracht naar een nummer. Mijn implementatie brengt de locatie van een object terug tot een 8-bit unsigned int, die over 2 nibbles is verdeeld. de meest significante nibble word gebruikt door de x coordinaat, en de minst significante nibble de y coordinaat.
Het systeem waar deze coordinaten naar verwijzen is de het vlak in de vlakkenverdeling waarin een positie zich bevind.
Het systeem waar deze coordinaten naar verwijzen is de het vlak in de vlakkenverdeling waarin een object zich bevind.
> Met 8 bits hebben we 255 mogelijke opties, dit betekend dat de grootste vlakkenverdeling mogelijk 16x16 is.
> (Met 8 bits hebben we 255 mogelijke opties, dit betekend dat de grootste vlakkenverdeling mogelijk 16x16 is.
> Een andere grootte van hash zou mogelijk zijn, maar groter bleek niet nodig om de bedoelde verbetering binnen te halen).
## Performance
De performance-verbetering door deze hashing-strategie is redelijk hoog. Gemiddelde frametime valt van `0.08...` naar `0.03...` gemiddeld op mijn AMD Ryzen AI 9 HX 370 met `2500` particles (de standaard hoeveelheid waarmee de voorbeeldimplementatie is aangeleverd).
De performance-verbetering door deze hashing-strategie is stevig. Gemiddelde frametime valt van `0.08...` naar `0.005...` op mijn AMD Ryzen 9 HX 370 met `2500` particles (de standaard hoeveelheid waarmee de voorbeeldimplementatie is aangeleverd).
> (Benchmarks verzameld met de `BenchMark` class, die gebruik maakt van `SFML/System/Time.hpp`).
De instellingen variëren nogal in effectiviteit. De instellingen waarmee de eerder genoemde resultaten zijn gemeten zijn:
* `16` hash grid divisions (dus een vlakkenverdeling van 16x16).
* `255` hash buckets.
Hoe meer grid divisions hoe beter blijkt volgens mijn tests. 16 is de max voor mijn hashing-strategie, dus 255 is de max voor hashbuckets. De impact op ram blijkt ook minimaal te zijn voor verschillende hoeveelheden, dus alles op maximum zetten is optimaal.
De belangrijkste limitatie van de hashingstrategie is dat het complex is om de wereld-grootte aan te passen in runtime. Dus de `worldBounds` worden in `initialize` vastgezet en daarna niet meer aangepast.

View file

@ -1,8 +1,5 @@
#include "simulation_v2.h"
#include "SFML/Graphics/RectangleShape.hpp"
#include "SFML/Graphics/Text.hpp"
#include "SFML/Graphics/Texture.hpp"
#include "SFML/Graphics/Vertex.hpp"
#include "SFML/Graphics/VertexArray.hpp"
#include <SFML/Graphics/CircleShape.hpp>
#include <array>
@ -10,13 +7,12 @@
#include <cstdint>
#include <cstdlib>
#include <mutex>
#include <print>
#include <random>
#include <ranges>
#include <set>
#define HASH_BUCKETS 24
#define HASH_GRID_DIVISIONS 18
#define HASH_BUCKETS 255
#define HASH_GRID_DIVISIONS 16
namespace v2 {
typedef uint8_t PointHash;