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. 4
      spatialmap.cpp
  6. 2
      spatialmap.hpp
  7. 2
      tests/spatialmap.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<Player>();
auto player_combat = $level.world->get<Combat>(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);
}

@ -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]"

@ -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);

@ -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) {

@ -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,8 +73,10 @@ SortedEntities SpatialMap::distance_sorted(Point from) {
int inside = (from.x - sprite.x) * (from.x - sprite.x) +
(from.y - sprite.y) * (from.y - sprite.y);
if(inside < max_dist) {
sprite_distance.push_back({inside, rec.second});
}
}
std::sort(sprite_distance.begin(), sprite_distance.end(), std::greater<>());

@ -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(); }
};

@ -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;

Loading…
Cancel
Save