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