feat: last changes for documentation
This commit is contained in:
parent
0affb60ae1
commit
0bcb4ce4b1
22
CHANGES.md
22
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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue