C ++如何使长计算工作

时间:2014-10-24 13:27:32

标签: c++ optimization

我正在为一个体素引擎进行原型设计,而且还没有像八叉树这样的优化,所以我计算每个体素进行剔除需要很长时间。 当我有一个16 * 16 * 16的体素图进行计算时,计算和渲染时间不到0.1秒。

但是,当我有更大的地图,如100 * 32 * 100,它永远不会结束计算(等待10分钟仍然没有渲染),我有一个白色的屏幕,程序就像卡在一个无限循环,但它不应该'无限。

计算是否有时间限制?

编辑: 这是剔除的循环:

for (auto it = Chunk.begin(); it != Chunk.end(); ++it)
{
    if ((*it).w != 0)
    {
        Vector3f position = Vector3f((*it).x, (*it).y, (*it).z);
        Vector3f top(position.x, position.y + 1, position.z);
        Vector3f down(position.x, position.y - 1, position.z);
        Vector3f front(position.x, position.y, position.z - 1);
        Vector3f back(position.x, position.y, position.z + 1);
        Vector3f left(position.x + 1, position.y, position.z);
        Vector3f right(position.x - 1, position.y, position.z);

        auto findTop = std::find_if(Chunk.begin(), Chunk.end(), [=](Vector4f vec) { if (top == Vector3f(vec.x, vec.y, vec.z)) { return true; } else { return false; } });
        auto findDown = std::find_if(Chunk.begin(), Chunk.end(), [=](Vector4f vec) { if (down == Vector3f(vec.x, vec.y, vec.z)) { return true; } else { return false; } });
        auto findFront = std::find_if(Chunk.begin(), Chunk.end(), [=](Vector4f vec) { if (front == Vector3f(vec.x, vec.y, vec.z)) { return true; } else { return false; } });
        auto findBack = std::find_if(Chunk.begin(), Chunk.end(), [=](Vector4f vec) { if (back == Vector3f(vec.x, vec.y, vec.z)) { return true; } else { return false; } });
        auto findLeft = std::find_if(Chunk.begin(), Chunk.end(), [=](Vector4f vec) { if (left == Vector3f(vec.x, vec.y, vec.z)) { return true; } else { return false; } });
        auto findRight = std::find_if(Chunk.begin(), Chunk.end(), [=](Vector4f vec) { if (right == Vector3f(vec.x, vec.y, vec.z)) { return true; } else { return false; } });

        bool isTopOpaque, isDownOpaque, isFrontOpaque, isBackOpaque, isLeftOpaque, isRightOpaque;

        if (findTop == Chunk.end())
            isTopOpaque = false;
        else
            isTopOpaque = findTop->w;

        if (findDown == Chunk.end())
            isDownOpaque = false;
        else
            isDownOpaque = findDown->w;

        if (findFront == Chunk.end())
            isFrontOpaque = false;
        else
            isFrontOpaque = findFront->w;

        if (findBack == Chunk.end())
            isBackOpaque = false;
        else
            isBackOpaque = findBack->w;

        if (findLeft == Chunk.end())
            isLeftOpaque = false;
        else
            isLeftOpaque = findLeft->w;

        if (findRight == Chunk.end())
            isRightOpaque = false;
        else
            isRightOpaque = findRight->w;

        if (!(isTopOpaque && isDownOpaque && isFrontOpaque && isBackOpaque && isLeftOpaque && isRightOpaque))
        {
            glm::mat4 modelM = glm::translate(glm::mat4(1.0f), glm::vec3(2.0 * position.x, position.y * 2.0, 2.0 * position.z));
            size++;
            modelMatrices.push_back(modelM);
        }
    }   
}

"大块"是4d向量的std ::向量,(x,y,z)是位置,(w)表示它是不透明的(1)还是不是(0)。我正在使用VS2013 IDE。

1 个答案:

答案 0 :(得分:2)

这6个find_if调用正在对循环的每次迭代进行线性搜索并比较这些向量。算法是N ^ 2的阶数,对于较大的情况,这将是缓慢的。

如果您的向量包含1000个元素,则find_if调用可能会在最坏的情况下比较6,000,000个元素。在2000个元素中,它跃升至24,000,000个比较。

如果您正在运行VS 2013 Professional或更高版本,只需为较小的案例配置代码,并查看算法花费的时间。解决性能问题的第一步是收集实际测量结果,以了解需要改进的地方。