Performance check showed that I was checking every sprite even if they're way far away so now just do ones near-ish.
This commit is contained in:
parent
29e6d45dc6
commit
5179709e3c
7 changed files with 13 additions and 13 deletions
|
@ -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…
Add table
Add a link
Reference in a new issue