Оптимизация для реализации Game of Life

Для представления всех ячеек я использую переменную std::vector<bool> cells представлять клетки, где true представляет собой живую клетку. Для обновления холста у меня есть переменная std::vector<int> neighborCounts, где neighborCounts[i] представляет сколько живых соседей cell[i] есть. В цикле обновления я перебираю все ячейки и, если это живая ячейка, добавляю 1 к neighborCounts из всех соседних клеток. Затем, после определения всех соседей, я снова перебираю все ячейки и выполняю обновления в зависимости от количества соседей.

std::vector<int> neighborCounts(NUM_ROWS * ROW_SIZE, 0);
for (int x = 0; x < ROW_SIZE; x++)
{
for (int y = 0; y < NUM_ROWS; y++)
{
if (cells[convertCoord(x, y)])
{
for (int m = x - 1; m <= x + 1; m++)
{
for (int n = y - 1; n <= y + 1; n++)
{
if (!(m == x && n == y) && m >= 0 && m < ROW_SIZE && n >= 0 && n < NUM_ROWS)
{
neighborCounts[convertCoord(m, n)] += 1;
}
}
}
}
}
}
for (int x = 0; x < ROW_SIZE; x++)
{
for (int y = 0; y < NUM_ROWS; y++)
{
int coord = convertCoord(x, y);
int numNeighbors = neighborCounts[coord];
if (cells[coord])
{
if (numNeighbors < 2)
{
cells[coord] = false;
}
else if (numNeighbors > 3)
{
cells[coord] = false;
}
}
else
{
if (numNeighbors == 3)
{
cells[coord] = true;
}
}
}
}

Затем в функции рендеринга я перебираю все ячейки и, если она жива, я рисую ее на экране.

Это, кажется, самый простой способ сделать это, но определенно есть место для дальнейшей оптимизации. Как игрушки из пудры и другие приложения управляют огромным количеством частиц, и при этом все еще могут работать на удивление гладко? Какой самый эффективный способ управлять всеми клетками в игре жизни Конвея?

0

Решение

Задача ещё не решена.

Другие решения