Call reserve and add uncommited code

This commit is contained in:
Corentin Jabot 2021-07-16 09:19:10 +02:00
parent 691aac978e
commit 0428366e86
2 changed files with 23 additions and 13 deletions

View file

@ -16,14 +16,6 @@ enum class Cell {
right_portal = 7 right_portal = 7
}; };
// Legend
// 0 - wall
// 1 - pellet
// 2 - nothing
// 3 - door
// 4 - superpower
// 5 - pen doors
// clang-format off // clang-format off
constexpr std::array<std::array<int, COLUMNS>, ROWS> board = {{ constexpr std::array<std::array<int, COLUMNS>, ROWS> board = {{
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
@ -99,6 +91,8 @@ GridPosition teleport(GridPosition point) {
std::vector<GridPosition> initialPelletPositions() { std::vector<GridPosition> initialPelletPositions() {
std::vector<GridPosition> positions; std::vector<GridPosition> positions;
positions.reserve(4); // Reserve space for 4 supper pellets
for (std::size_t row = 0; row < ROWS; row++) { for (std::size_t row = 0; row < ROWS; row++) {
for (std::size_t column = 0; column < COLUMNS; column++) { for (std::size_t column = 0; column < COLUMNS; column++) {
if (board[row][column] == int(Cell::pellet)) if (board[row][column] == int(Cell::pellet))
@ -110,6 +104,17 @@ std::vector<GridPosition> initialPelletPositions() {
std::vector<GridPosition> initialSuperPelletPositions() { std::vector<GridPosition> initialSuperPelletPositions() {
std::vector<GridPosition> positions; std::vector<GridPosition> positions;
// To avoid having to resize the vector too many times, we can
// presemptively reserve space for elements.
// At a glance, we can estimate that there are pellets on a third of the grid.
// This is not accurate so we might either reserve too much or too little memory,
// but this is will still be faster than not calling reserve at all!
// This will be very noticeable on both very large vectors (10 thousands of elements),
// Or small vectors in functions called very frequently.
positions.reserve((ROWS * COLUMNS) / 3);
for (std::size_t row = 0; row < ROWS; row++) { for (std::size_t row = 0; row < ROWS; row++) {
for (std::size_t column = 0; column < COLUMNS; column++) { for (std::size_t column = 0; column < COLUMNS; column++) {
if (board[row][column] == int(Cell::power_pellet)) if (board[row][column] == int(Cell::power_pellet))

View file

@ -73,11 +73,16 @@ void Game::step(std::chrono::milliseconds delta, InputState inputState) {
if (!gameState.pacMan.hasDirection()) if (!gameState.pacMan.hasDirection())
return; return;
std::apply([&](auto &... ghost) { gameState.blinky.update(delta);
(ghost.update(delta), ...); gameState.speedy.update(delta);
(checkCollision(ghost), ...); gameState.inky.update(delta);
}, gameState.clyde.update(delta);
gameState.ghosts);
checkCollision(gameState.blinky);
checkCollision(gameState.speedy);
checkCollision(gameState.inky);
checkCollision(gameState.clyde);
eatPellets(); eatPellets();
} }