Performance check showed that I was checking every sprite even if they're way far away so now just do ones near-ish.

master
Zed A. Shaw 2 weeks ago
parent 29e6d45dc6
commit 5179709e3c
  1. 7
      main_ui.cpp
  2. 4
      overlay_ui.cpp
  3. 3
      overlay_ui.hpp
  4. 2
      raycaster.cpp
  5. 6
      spatialmap.cpp
  6. 2
      spatialmap.hpp
  7. 2
      tests/spatialmap.cpp

@ -6,7 +6,6 @@ namespace gui {
MainUI::MainUI(sf::RenderWindow& window) : MainUI::MainUI(sf::RenderWindow& window) :
$window(window), $window(window),
$overlay_ui($level),
$rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) $rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
{ {
$window.setVerticalSyncEnabled(VSYNC); $window.setVerticalSyncEnabled(VSYNC);
@ -37,6 +36,7 @@ namespace gui {
void MainUI::draw_stats() { void MainUI::draw_stats() {
auto player = $level.world->get_the<Player>(); auto player = $level.world->get_the<Player>();
auto player_combat = $level.world->get<Combat>(player.entity); auto player_combat = $level.world->get<Combat>(player.entity);
auto map = $level.map;
std::string stats = fmt::format("STATS\n" std::string stats = fmt::format("STATS\n"
"HP: {}\n" "HP: {}\n"
"mean:{:>8.5}\n" "mean:{:>8.5}\n"
@ -44,12 +44,13 @@ namespace gui {
"min: {:>8.5}\n" "min: {:>8.5}\n"
"max: {:>8.5}\n" "max: {:>8.5}\n"
"count:{:<10}\n\n" "count:{:<10}\n\n"
"level: {} size: {}x{}\n\n"
"VSync? {}\n" "VSync? {}\n"
"FR Limit: {}\n" "FR Limit: {}\n"
"Debug? {}\n\n", "Debug? {}\n\n",
player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min, player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min,
$stats.max, $stats.n, VSYNC, $stats.max, $stats.n, $level.index, map->width(), map->height(),
FRAME_LIMIT, DEBUG_BUILD); VSYNC, FRAME_LIMIT, DEBUG_BUILD);
$overlay_ui.update_text("top_left", stats); $overlay_ui.update_text("top_left", stats);
} }

@ -8,9 +8,7 @@ namespace gui {
using namespace guecs; using namespace guecs;
using std::string; using std::string;
OverlayUI::OverlayUI(GameLevel level) : OverlayUI::OverlayUI() {
$level(level)
{
$gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT); $gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT);
$gui.layout( $gui.layout(
"[top_left|top|top_right]" "[top_left|top|top_right]"

@ -8,9 +8,8 @@ namespace gui {
class OverlayUI { class OverlayUI {
public: public:
guecs::UI $gui; guecs::UI $gui;
GameLevel $level;
OverlayUI(GameLevel level); OverlayUI();
void render(); void render();
void draw(sf::RenderWindow& window); void draw(sf::RenderWindow& window);

@ -75,7 +75,7 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) {
auto& lights = $level.lights->lighting(); auto& lights = $level.lights->lighting();
// sort sprites from far to close // 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 // after sorting the sprites, do the projection
for(auto& rec : sprite_order) { for(auto& rec : sprite_order) {

@ -65,7 +65,7 @@ FoundEntities SpatialMap::neighbors(Point cell, bool diag) const {
return {!result.empty(), result}; return {!result.empty(), result};
} }
SortedEntities SpatialMap::distance_sorted(Point from) { SortedEntities SpatialMap::distance_sorted(Point from, int max_dist) {
SortedEntities sprite_distance; SortedEntities sprite_distance;
for(const auto &rec : table) { 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) + int inside = (from.x - sprite.x) * (from.x - sprite.x) +
(from.y - sprite.y) * (from.y - sprite.y); (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<>()); std::sort(sprite_distance.begin(), sprite_distance.end(), std::greater<>());

@ -28,6 +28,6 @@ class SpatialMap {
DinkyECS::Entity get(Point at) const; DinkyECS::Entity get(Point at) const;
FoundEntities neighbors(Point position, bool diag=false) 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(); } size_t size() { return table.size(); }
}; };

@ -152,7 +152,7 @@ TEST_CASE("confirm can iterate through all", "[spatialmap-sort]") {
collider.insert({x,y}, ent); 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; int prev_dist = sprite_distance[0].first;

Loading…
Cancel
Save