commit 9c4d2c191a189d21f18ad0b218e2594605169147
parent ae29e29635cccbd2ec4392876c3f226519a35285
Author: Andrew Laack <andrew@laack.co>
Date: Thu, 17 Sep 2026 02:48:11 -0500
Benchmarking and general improvements to decrease overdrawing and increase texture map reuse
Diffstat:
9 files changed, 94 insertions(+), 8 deletions(-)
diff --git a/benchmarking/bench.sh b/benchmarking/bench.sh
@@ -1,5 +1,5 @@
while [ 1 ]; do
- /usr/bin/time -o out -f '%S,%U,%e' ./abg.out -s 0 --edges 10000 --vertices 1000 >/dev/null 2>&1
- cat out | tee -a benchmarking/simpler_render_v_1000_e_10000_s_0/out1.csv
+ /usr/bin/time -o out -f '%S,%U,%e' ./abg.out -s 0 --edges 100000 --vertices 10000 >/dev/null 2>&1
+ cat out | tee -a benchmarking/track_to_render_v_10000_e_100000_s_0/out1.csv
sleep 1
done
diff --git a/benchmarking/cache_blank_graph_v_1000_e_10000_s_0/out1.csv b/benchmarking/cache_blank_graph_v_1000_e_10000_s_0/out1.csv
@@ -0,0 +1,28 @@
+0.19,1.77,3.86
+0.17,1.76,3.81
+0.19,1.76,3.82
+0.18,1.75,3.85
+0.18,1.71,3.86
+0.19,1.68,3.83
+0.18,1.72,3.83
+0.19,1.72,3.85
+0.20,1.76,3.86
+0.17,1.77,3.84
+0.18,1.73,3.84
+0.17,1.66,3.84
+0.20,1.75,3.85
+0.19,1.72,3.81
+0.18,1.74,3.81
+0.19,1.79,3.86
+0.19,1.73,3.83
+0.19,1.67,3.81
+0.20,1.73,3.83
+0.20,1.74,3.89
+0.19,1.70,3.87
+0.20,1.78,3.89
+0.16,1.67,3.84
+0.19,1.77,3.87
+0.19,1.73,3.88
+0.16,1.82,3.89
+0.19,1.71,3.88
+0.21,1.76,3.89
diff --git a/benchmarking/cache_first_use_blank_graph_v_10000_e_100000_s_0/out1.csv b/benchmarking/cache_first_use_blank_graph_v_10000_e_100000_s_0/out1.csv
@@ -0,0 +1,2 @@
+1.40,28.92,35.76
+1.53,29.30,35.95
diff --git a/benchmarking/cache_first_use_blank_graph_v_1000_e_10000_s_0/out1.csv b/benchmarking/cache_first_use_blank_graph_v_1000_e_10000_s_0/out1.csv
@@ -0,0 +1,12 @@
+0.17,0.65,3.06
+0.18,0.63,3.05
+0.18,0.66,3.05
+0.18,0.64,3.05
+0.18,0.64,3.04
+0.17,0.63,3.02
+0.18,0.62,3.04
+0.19,0.64,3.05
+0.17,0.65,3.04
+0.17,0.66,3.03
+0.18,0.62,3.04
+0.17,0.63,3.03
diff --git a/benchmarking/track_to_render_v_10000_e_100000_s_0/out1.csv b/benchmarking/track_to_render_v_10000_e_100000_s_0/out1.csv
@@ -0,0 +1,4 @@
+1.50,3.12,29.43
+1.51,3.20,29.67
+1.57,3.08,30.00
+1.57,3.04,30.07
diff --git a/include/graph.hpp b/include/graph.hpp
@@ -12,6 +12,9 @@ class Graph {
private:
std::vector<std::vector<Edge>> edges{};
std::vector<Vertex> vertices {};
+ std::vector<Vertex*> verticesToRender {}; // these point to
+ std::vector<Edge*> edgesToRender {}; // elements in the other vectors.
+ // past init, vertices and edges don't vary
public:
// based on the edgeCount and vertCount, random edges and vertices will be
@@ -20,6 +23,7 @@ public:
uint32_t yMax, std::uint32_t seed = std::random_device{}());
std::string toString() noexcept;
void render() noexcept;
+ void renderUnrenderedTraversed() noexcept;
void traverseVertexIdx(std::size_t idx);
std::vector<Edge> getEdgesOfVertexIdx(std::size_t idx);
std::vector<Edge>* getEdgesWithUnvisitedVertices(std::size_t idx);
diff --git a/src/graph.cpp b/src/graph.cpp
@@ -75,6 +75,24 @@ std::string Graph::toString() noexcept {
return result;
}
+// only render newly traversed edges / nodes.
+void Graph::renderUnrenderedTraversed() noexcept {
+ for (auto* edgesT : edgesToRender) {
+ auto& edge = *edgesT;
+ std::size_t idx1 = edge.v1Index;
+ std::size_t idx2 = edge.v2Index;
+ auto v1 = vertices[idx1].position;
+ auto v2 = vertices[idx2].position;
+ DrawLineEx(v1, v2, EDGE_REDNER_SIZE, WHITE);
+ }
+ edgesToRender = {};
+
+ for (auto* vertex : verticesToRender) {
+ vertex->render();
+ }
+ verticesToRender = {};
+}
+
void Graph::render() noexcept {
std::vector<Edge> visited{};
for (auto& edgesT : this->edges) {
@@ -115,6 +133,7 @@ void Graph::render() noexcept {
void Graph::traverseVertexIdx(std::size_t idx) {
this->vertices[idx].visited = true;
+ verticesToRender.push_back(&vertices[idx]);
}
// we assume the current vertex is already marked as traversed so we check to
@@ -154,6 +173,7 @@ void Graph::setEdgeTraversed(Edge e) {
for (auto& edge : oEdges) {
if (edge.v2Index == source || edge.v1Index == source) {
edge.traversed = true;
+ edgesToRender.push_back(&edge);
}
}
}
diff --git a/src/main.cpp b/src/main.cpp
@@ -14,9 +14,13 @@
#include "../include/prim.hpp"
#include "../vendor/argparse.hpp"
-int main(int argc, char** argv) {
- srand(clock());
+#ifdef NDEBUG
+#define DEBUG true
+#else
+#define DEBUG false
+#endif
+int main(int argc, char** argv) {
// reverse semver
// software does get completed at some point, and for me that's at 1.0.0.
@@ -83,7 +87,6 @@ int main(int argc, char** argv) {
// with Font.
InitWindow(xMax, yMax, "abg");
-
sendToBg("abg");
while (!WindowShouldClose()) {
@@ -98,10 +101,24 @@ int main(int argc, char** argv) {
g.traverseVertexIdx(0);
visitedIndices.insert(0);
+ RenderTexture2D blankGraph = LoadRenderTexture(xMax, yMax);
+ BeginTextureMode(blankGraph);
+ ClearBackground(BLACK);
+ g.render();
+ EndTextureMode();
+
while (!WindowShouldClose() && toVisit.size() != 0) {
+ BeginTextureMode(blankGraph);
+ g.renderUnrenderedTraversed();
+ EndTextureMode();
+
BeginDrawing();
- ClearBackground(BLACK);
- g.render();
+
+ // RLAPI void DrawTexture(Texture2D texture, int posX, int posY,
+ // Color tint); // Draw a Texture2D
+
+ DrawTexture(blankGraph.texture, 0, 0, WHITE);
+
EndDrawing();
// since we wait sleepTime here, the bg render has a render delta of
diff --git a/src/prim.cpp b/src/prim.cpp
@@ -1,6 +1,5 @@
#include "../include/prim.hpp"
-#include <raylib.h>
#include <unistd.h>
#include <cstdlib>