diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2019-02-23 12:15:46 -0500 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2019-02-23 12:15:46 -0500 |
| commit | 3504fd5080dbcfd0172299c5c6d13895e53ad163 (patch) | |
| tree | caab8e868566262b3aa4d80aa6a06cdf13e7c21d | |
| parent | 15b511e694f976686fdec1fb9f959f8a92f3b594 (diff) | |
| download | dispatcher-3504fd5080dbcfd0172299c5c6d13895e53ad163.tar.gz dispatcher-3504fd5080dbcfd0172299c5c6d13895e53ad163.tar.bz2 dispatcher-3504fd5080dbcfd0172299c5c6d13895e53ad163.zip | |
Removed position caches
There aren't going to be enough entities at once for position checking to ever really be a bottleneck, I don't think. Removing the caches makes the range logic a bit more intuitive, and it removes the possibility of accidentally not updating a cache when it needs to be.
| -rw-r--r-- | src/grid_cache.h | 59 | ||||
| -rw-r--r-- | src/simulation.cpp | 22 | ||||
| -rw-r--r-- | src/simulation.h | 4 | ||||
| -rw-r--r-- | src/vector.h | 5 | ||||
| -rw-r--r-- | src/views.h | 14 |
5 files changed, 27 insertions, 77 deletions
| diff --git a/src/grid_cache.h b/src/grid_cache.h deleted file mode 100644 index e837f55..0000000 --- a/src/grid_cache.h +++ /dev/null | |||
| @@ -1,59 +0,0 @@ | |||
| 1 | #ifndef GRID_CACHE_H_67BBE74D | ||
| 2 | #define GRID_CACHE_H_67BBE74D | ||
| 3 | |||
| 4 | #include <unordered_map> | ||
| 5 | #include <unordered_set> | ||
| 6 | #include "level.h" | ||
| 7 | |||
| 8 | template <typename T> | ||
| 9 | class GridCache { | ||
| 10 | public: | ||
| 11 | |||
| 12 | explicit GridCache(const Level& level) : width_(level.getSize().w()) | ||
| 13 | { | ||
| 14 | } | ||
| 15 | |||
| 16 | void set(T value, vec2s pos) | ||
| 17 | { | ||
| 18 | if (reverse_.count(value)) | ||
| 19 | { | ||
| 20 | size_t oldPosIndex = reverse_.at(value); | ||
| 21 | lookup_[oldPosIndex].erase(value); | ||
| 22 | } | ||
| 23 | |||
| 24 | size_t newPosIndex = getIndex(pos); | ||
| 25 | lookup_[newPosIndex].insert(value); | ||
| 26 | reverse_[value] = newPosIndex; | ||
| 27 | } | ||
| 28 | |||
| 29 | void remove(T value) | ||
| 30 | { | ||
| 31 | if (reverse_.count(value)) | ||
| 32 | { | ||
| 33 | size_t index = reverse_.at(value); | ||
| 34 | lookup_[index].erase(value); | ||
| 35 | reverse_.erase(value); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | const std::unordered_set<T>& at(vec2s pos) const | ||
| 40 | { | ||
| 41 | size_t index = getIndex(pos); | ||
| 42 | |||
| 43 | return lookup_[index]; | ||
| 44 | } | ||
| 45 | |||
| 46 | private: | ||
| 47 | |||
| 48 | inline size_t getIndex(const vec2s& pos) const | ||
| 49 | { | ||
| 50 | return pos.x() + pos.y() * width_; | ||
| 51 | } | ||
| 52 | |||
| 53 | size_t width_; | ||
| 54 | |||
| 55 | mutable std::unordered_map<size_t, std::unordered_set<T>> lookup_; | ||
| 56 | std::unordered_map<T, size_t> reverse_; | ||
| 57 | }; | ||
| 58 | |||
| 59 | #endif /* end of include guard: GRID_CACHE_H_67BBE74D */ | ||
| diff --git a/src/simulation.cpp b/src/simulation.cpp index f75bd3d..27ac6ab 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp | |||
| @@ -89,12 +89,6 @@ Simulation::Simulation( | |||
| 89 | crate2.canBePushedBy.insert(ColliderType::crate); | 89 | crate2.canBePushedBy.insert(ColliderType::crate); |
| 90 | crate2.canBePushedBy.insert(ColliderType::train); | 90 | crate2.canBePushedBy.insert(ColliderType::train); |
| 91 | crate2.gridPos = vec2s { 6, 7 }; | 91 | crate2.gridPos = vec2s { 6, 7 }; |
| 92 | |||
| 93 | |||
| 94 | for (Entity& entity : active_ | entityView()) | ||
| 95 | { | ||
| 96 | posCache_.set(entity.id, entity.gridPos); | ||
| 97 | } | ||
| 98 | } | 92 | } |
| 99 | 93 | ||
| 100 | void Simulation::tick( | 94 | void Simulation::tick( |
| @@ -132,8 +126,9 @@ void Simulation::tick( | |||
| 132 | vec2s lookPos = posInDir(entity.gridPos, lookDir); | 126 | vec2s lookPos = posInDir(entity.gridPos, lookDir); |
| 133 | 127 | ||
| 134 | for (Entity& block : | 128 | for (Entity& block : |
| 135 | posCache_.at(lookPos) | | 129 | active_ | |
| 136 | entityView() | | 130 | entityView() | |
| 131 | views::atGridPos(lookPos) | | ||
| 137 | views::isNotMoving() | | 132 | views::isNotMoving() | |
| 138 | views::canBePushedBy(entity.colliderType) | | 133 | views::canBePushedBy(entity.colliderType) | |
| 139 | views::isOnLayer(entity.layer)) | 134 | views::isOnLayer(entity.layer)) |
| @@ -185,8 +180,9 @@ void Simulation::tick( | |||
| 185 | views::isNotMoving()) | 180 | views::isNotMoving()) |
| 186 | { | 181 | { |
| 187 | auto tracks = | 182 | auto tracks = |
| 188 | posCache_.at(entity.gridPos) | | 183 | active_ | |
| 189 | entityView() | | 184 | entityView() | |
| 185 | views::atGridPos(entity.gridPos) | | ||
| 190 | views::isTrack(); | 186 | views::isTrack(); |
| 191 | 187 | ||
| 192 | if (!ranges::empty(tracks)) | 188 | if (!ranges::empty(tracks)) |
| @@ -233,8 +229,6 @@ void Simulation::tick( | |||
| 233 | { | 229 | { |
| 234 | entity.moving = false; | 230 | entity.moving = false; |
| 235 | entity.gridPos = entity.destPos; | 231 | entity.gridPos = entity.destPos; |
| 236 | posCache_.set(entity.id, entity.gridPos); | ||
| 237 | moveToCache_.remove(entity.id); | ||
| 238 | } | 232 | } |
| 239 | } | 233 | } |
| 240 | 234 | ||
| @@ -340,16 +334,18 @@ bool Simulation::moveEntityOnGrid( | |||
| 340 | 334 | ||
| 341 | // Can't move into a space that something else is already moving into. | 335 | // Can't move into a space that something else is already moving into. |
| 342 | if (!ranges::empty( | 336 | if (!ranges::empty( |
| 343 | moveToCache_.at(shouldMoveTo) | | 337 | active_ | |
| 344 | entityView() | | 338 | entityView() | |
| 339 | views::isMovingTo(shouldMoveTo) | | ||
| 345 | views::isOnLayer(entity.layer))) | 340 | views::isOnLayer(entity.layer))) |
| 346 | { | 341 | { |
| 347 | return false; | 342 | return false; |
| 348 | } | 343 | } |
| 349 | 344 | ||
| 350 | for (Entity& block : | 345 | for (Entity& block : |
| 351 | posCache_.at(shouldMoveTo) | | 346 | active_ | |
| 352 | entityView() | | 347 | entityView() | |
| 348 | views::atGridPos(shouldMoveTo) | | ||
| 353 | views::isOnLayer(entity.layer)) | 349 | views::isOnLayer(entity.layer)) |
| 354 | { | 350 | { |
| 355 | if (!block.moving) | 351 | if (!block.moving) |
| @@ -389,8 +385,6 @@ bool Simulation::moveEntityOnGrid( | |||
| 389 | entity.destPos = shouldMoveTo; | 385 | entity.destPos = shouldMoveTo; |
| 390 | entity.movementTween = 0.0; | 386 | entity.movementTween = 0.0; |
| 391 | entity.moveDir = moveDir; | 387 | entity.moveDir = moveDir; |
| 392 | |||
| 393 | moveToCache_.set(entity.id, entity.destPos); | ||
| 394 | } | 388 | } |
| 395 | 389 | ||
| 396 | return true; | 390 | return true; |
| diff --git a/src/simulation.h b/src/simulation.h index a205796..096377c 100644 --- a/src/simulation.h +++ b/src/simulation.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | #include "entity.h" | 4 | #include "entity.h" |
| 5 | #include "renderer.h" | 5 | #include "renderer.h" |
| 6 | #include "schedule.h" | 6 | #include "schedule.h" |
| 7 | #include "grid_cache.h" | ||
| 8 | #include <range/v3/all.hpp> | 7 | #include <range/v3/all.hpp> |
| 9 | #include <vector> | 8 | #include <vector> |
| 10 | #include <deque> | 9 | #include <deque> |
| @@ -76,9 +75,6 @@ private: | |||
| 76 | std::vector<Entity> entities_; | 75 | std::vector<Entity> entities_; |
| 77 | std::deque<id_type> available_; | 76 | std::deque<id_type> available_; |
| 78 | std::set<id_type> active_; | 77 | std::set<id_type> active_; |
| 79 | |||
| 80 | mutable GridCache<id_type> posCache_ { level_ }; | ||
| 81 | mutable GridCache<id_type> moveToCache_ { level_ }; | ||
| 82 | }; | 78 | }; |
| 83 | 79 | ||
| 84 | #endif /* end of include guard: SIMULATION_H_7BF6EEA4 */ | 80 | #endif /* end of include guard: SIMULATION_H_7BF6EEA4 */ |
| diff --git a/src/vector.h b/src/vector.h index 10fe4da..a94aea0 100644 --- a/src/vector.h +++ b/src/vector.h | |||
| @@ -112,6 +112,11 @@ public: | |||
| 112 | return vec2(x() * other.x(), y() * other.y()); | 112 | return vec2(x() * other.x(), y() * other.y()); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | constexpr bool operator==(const vec2& other) const | ||
| 116 | { | ||
| 117 | return (x() == other.x()) && (y() == other.y()); | ||
| 118 | } | ||
| 119 | |||
| 115 | }; | 120 | }; |
| 116 | 121 | ||
| 117 | using vec2s = vec2<size_t>; | 122 | using vec2s = vec2<size_t>; |
| diff --git a/src/views.h b/src/views.h index 69bd2b5..540dc52 100644 --- a/src/views.h +++ b/src/views.h | |||
| @@ -55,6 +55,20 @@ namespace views { | |||
| 55 | }); | 55 | }); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | inline auto atGridPos(vec2s pos) | ||
| 59 | { | ||
| 60 | return ranges::view::filter([pos] (const Entity& entity) { | ||
| 61 | return entity.gridPos == pos; | ||
| 62 | }); | ||
| 63 | } | ||
| 64 | |||
| 65 | inline auto isMovingTo(vec2s pos) | ||
| 66 | { | ||
| 67 | return ranges::view::filter([pos] (const Entity& entity) { | ||
| 68 | return entity.moving && entity.destPos == pos; | ||
| 69 | }); | ||
| 70 | } | ||
| 71 | |||
| 58 | 72 | ||
| 59 | 73 | ||
| 60 | } | 74 | } |
