Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生命游戏的优化实现_C++_Performance_Optimization_Conways Game Of Life - Fatal编程技术网

C++ 生命游戏的优化实现

C++ 生命游戏的优化实现,c++,performance,optimization,conways-game-of-life,C++,Performance,Optimization,Conways Game Of Life,为了表示所有单元格,我使用变量std::vector cells来表示单元格,其中true表示活单元格。为了更新画布,我有一个变量std::vector neightarcounts,其中neightarcounts[I]表示cell[I]有多少个活动邻居。在更新循环中,我循环所有单元格,如果它是活动单元格,我在所有相邻单元格的相邻计数中添加1。然后在确定所有的邻居之后,我再次遍历所有的单元格,并根据它拥有的邻居的数量执行更新 std::vector<int> neighborCou

为了表示所有单元格,我使用变量std::vector cells来表示单元格,其中true表示活单元格。为了更新画布,我有一个变量std::vector neightarcounts,其中neightarcounts[I]表示cell[I]有多少个活动邻居。在更新循环中,我循环所有单元格,如果它是活动单元格,我在所有相邻单元格的相邻计数中添加1。然后在确定所有的邻居之后,我再次遍历所有的单元格,并根据它拥有的邻居的数量执行更新

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;
            }
        }
    }
}
然后在渲染函数中,我循环遍历所有单元格,如果它是活动的,我将其绘制到屏幕上


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

我至少从瓷砖开始。4x4磁贴是16位可能状态。可以生成从4x4平铺到内部2x2子文件状态的映射。可以执行位操作来生成重叠平铺结果。位洗牌可以取两个4x4平铺,并生成4x4半重叠的状态索引,或4个4x4平铺,并生成角重叠的4x4平铺。几乎完全没有小枝。那么我很想用gpu处理它。请阅读以下内容: