abg

Animated background for X11
git clone git://git.laack.co/abg.git
Log | Files | Refs | README | LICENSE

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:
Mbenchmarking/bench.sh | 4++--
Abenchmarking/cache_blank_graph_v_1000_e_10000_s_0/out1.csv | 28++++++++++++++++++++++++++++
Abenchmarking/cache_first_use_blank_graph_v_10000_e_100000_s_0/out1.csv | 2++
Abenchmarking/cache_first_use_blank_graph_v_1000_e_10000_s_0/out1.csv | 12++++++++++++
Abenchmarking/track_to_render_v_10000_e_100000_s_0/out1.csv | 4++++
Minclude/graph.hpp | 4++++
Msrc/graph.cpp | 20++++++++++++++++++++
Msrc/main.cpp | 27++++++++++++++++++++++-----
Msrc/prim.cpp | 1-
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>