From 5179709e3c91e6e6e8edbd9a3f91168044fcf32d Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 25 Feb 2025 00:56:54 -0500 Subject: [PATCH] Performance check showed that I was checking every sprite even if they're way far away so now just do ones near-ish. --- main_ui.cpp | 7 ++++--- overlay_ui.cpp | 4 +--- overlay_ui.hpp | 3 +-- raycaster.cpp | 2 +- spatialmap.cpp | 6 ++++-- spatialmap.hpp | 2 +- tests/spatialmap.cpp | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/main_ui.cpp b/main_ui.cpp index 60b52fe..880c444 100644 --- a/main_ui.cpp +++ b/main_ui.cpp @@ -6,7 +6,6 @@ namespace gui { MainUI::MainUI(sf::RenderWindow& window) : $window(window), - $overlay_ui($level), $rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) { $window.setVerticalSyncEnabled(VSYNC); @@ -37,6 +36,7 @@ namespace gui { void MainUI::draw_stats() { auto player = $level.world->get_the(); auto player_combat = $level.world->get(player.entity); + auto map = $level.map; std::string stats = fmt::format("STATS\n" "HP: {}\n" "mean:{:>8.5}\n" @@ -44,12 +44,13 @@ namespace gui { "min: {:>8.5}\n" "max: {:>8.5}\n" "count:{:<10}\n\n" + "level: {} size: {}x{}\n\n" "VSync? {}\n" "FR Limit: {}\n" "Debug? {}\n\n", player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min, - $stats.max, $stats.n, VSYNC, - FRAME_LIMIT, DEBUG_BUILD); + $stats.max, $stats.n, $level.index, map->width(), map->height(), + VSYNC, FRAME_LIMIT, DEBUG_BUILD); $overlay_ui.update_text("top_left", stats); } diff --git a/overlay_ui.cpp b/overlay_ui.cpp index d123a98..2c1233a 100644 --- a/overlay_ui.cpp +++ b/overlay_ui.cpp @@ -8,9 +8,7 @@ namespace gui { using namespace guecs; using std::string; - OverlayUI::OverlayUI(GameLevel level) : - $level(level) - { + OverlayUI::OverlayUI() { $gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT); $gui.layout( "[top_left|top|top_right]" diff --git a/overlay_ui.hpp b/overlay_ui.hpp index 03f0fd1..39568b4 100644 --- a/overlay_ui.hpp +++ b/overlay_ui.hpp @@ -8,9 +8,8 @@ namespace gui { class OverlayUI { public: guecs::UI $gui; - GameLevel $level; - OverlayUI(GameLevel level); + OverlayUI(); void render(); void draw(sf::RenderWindow& window); diff --git a/raycaster.cpp b/raycaster.cpp index e2e3db4..e503828 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -75,7 +75,7 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { auto& lights = $level.lights->lighting(); // sort sprites from far to close - auto sprite_order = $level.collision->distance_sorted({(size_t)$pos_x, (size_t)$pos_y}); + auto sprite_order = $level.collision->distance_sorted({(size_t)$pos_x, (size_t)$pos_y}, 500); // after sorting the sprites, do the projection for(auto& rec : sprite_order) { diff --git a/spatialmap.cpp b/spatialmap.cpp index 5c96233..979f2e9 100644 --- a/spatialmap.cpp +++ b/spatialmap.cpp @@ -65,7 +65,7 @@ FoundEntities SpatialMap::neighbors(Point cell, bool diag) const { return {!result.empty(), result}; } -SortedEntities SpatialMap::distance_sorted(Point from) { +SortedEntities SpatialMap::distance_sorted(Point from, int max_dist) { SortedEntities sprite_distance; for(const auto &rec : table) { @@ -73,7 +73,9 @@ SortedEntities SpatialMap::distance_sorted(Point from) { int inside = (from.x - sprite.x) * (from.x - sprite.x) + (from.y - sprite.y) * (from.y - sprite.y); - sprite_distance.push_back({inside, rec.second}); + if(inside < max_dist) { + sprite_distance.push_back({inside, rec.second}); + } } std::sort(sprite_distance.begin(), sprite_distance.end(), std::greater<>()); diff --git a/spatialmap.hpp b/spatialmap.hpp index 57b09d2..b3b83c5 100644 --- a/spatialmap.hpp +++ b/spatialmap.hpp @@ -28,6 +28,6 @@ class SpatialMap { DinkyECS::Entity get(Point at) const; FoundEntities neighbors(Point position, bool diag=false) const; - SortedEntities distance_sorted(Point from); + SortedEntities distance_sorted(Point from, int max_distance); size_t size() { return table.size(); } }; diff --git a/tests/spatialmap.cpp b/tests/spatialmap.cpp index fc34d28..214f8a9 100644 --- a/tests/spatialmap.cpp +++ b/tests/spatialmap.cpp @@ -152,7 +152,7 @@ TEST_CASE("confirm can iterate through all", "[spatialmap-sort]") { collider.insert({x,y}, ent); } - auto sprite_distance = collider.distance_sorted(player); + auto sprite_distance = collider.distance_sorted(player, 10000); int prev_dist = sprite_distance[0].first;