C++ 生命游戏的优化实现
为了表示所有单元格,我使用变量std::vector cells来表示单元格,其中true表示活单元格。为了更新画布,我有一个变量std::vector neightarcounts,其中neightarcounts[I]表示cell[I]有多少个活动邻居。在更新循环中,我循环所有单元格,如果它是活动单元格,我在所有相邻单元格的相邻计数中添加1。然后在确定所有的邻居之后,我再次遍历所有的单元格,并根据它拥有的邻居的数量执行更新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<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处理它。请阅读以下内容: