实现生命游戏的优化

时间:2015-04-02 02:52:14

标签: c++ performance optimization conways-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;
            }
        }
    }
}

然后在渲染功能中,我循环遍历所有单元格,如果它活着,我将它绘制到屏幕上。

这似乎是最简单的方法,但是进一步优化的空间肯定存在。粉末玩具和其他应用程序如何管理大量粒子,但仍然能够运行得非常流畅?在Conway的生命游戏中管理所有细胞的最有效方法是什么?

0 个答案:

没有答案