From 0bcb4ce4b15f51c6c87c385bc0a37c074be155f8 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 28 Oct 2025 23:00:20 +0100 Subject: [PATCH] feat: last changes for documentation --- CHANGES.md | 22 +++++++++++++++++----- src/simulation_v2.cpp | 8 ++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f4e7e69..b94dff2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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. diff --git a/src/simulation_v2.cpp b/src/simulation_v2.cpp index f33adcc..98ea461 100644 --- a/src/simulation_v2.cpp +++ b/src/simulation_v2.cpp @@ -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 #include @@ -10,13 +7,12 @@ #include #include #include -#include #include #include #include -#define HASH_BUCKETS 24 -#define HASH_GRID_DIVISIONS 18 +#define HASH_BUCKETS 255 +#define HASH_GRID_DIVISIONS 16 namespace v2 { typedef uint8_t PointHash;