C++ C++;如何进行长时间的计算

C++ C++;如何进行长时间的计算,c++,optimization,C++,Optimization,我正在制作一个体素引擎的原型,目前还没有像八叉树那样的优化,所以我正在计算每个体素以进行剔除,这需要很长时间。 当我要计算一个16*16*16体素贴图时,计算和渲染所需的时间不到0.1秒 但是当我有更大的地图,比如100*32*100,它永远不会停止计算(等待10分钟仍然没有渲染),我有一个白色的屏幕,程序就像卡在一个无限循环中,但它不应该是无限的 计算有时间限制吗 编辑: 以下是剔除循环: for (auto it = Chunk.begin(); it != Chunk.end(); ++i

我正在制作一个体素引擎的原型,目前还没有像八叉树那样的优化,所以我正在计算每个体素以进行剔除,这需要很长时间。 当我要计算一个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);
        }
    }   
}

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

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

如果向量包含1000个元素,那么find_If调用可能会在最坏的情况下比较6000000个元素。在2000个元素时,它跳到24000000个比较


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

只需为算法计算大oh。插入数字,看看它有多糟糕:)如果没有代码,甚至没有提到您的目标环境,就不可能说出多少有用的内容。您的算法可能效率低下。你可以读数学书来提高它。你可以把它并行化。您应该要求编译器对其进行优化。显示更多源代码,显示编译命令和环境(编译器、操作系统)!编辑您的问题以改进它!听起来像是将体素存储为一个(无序的?)坐标列表,这意味着任何空间参照都需要在该列表中进行搜索。这是一种存储空间数据的低效方法。您还将体素称为16x16x16。这是否意味着这些位置实际上是矩形的且间隔均匀?然后只需存储一个16*16*16的布尔向量来表示你的体素以及尺寸。查找
w
现在只是一个索引操作,前面是一个3D限制检查。“它永远不会结束”:您是否等到时间结束?大箱甚至没有那么大。如果
16*16*16
需要0.1s,那么
100*32*100
大约需要一个半小时。我同意。我编辑了我的答案以给出一个例子,N^2*6随着N的增加而迅速增加。