我正在为一个体素引擎进行原型设计,而且还没有像八叉树这样的优化,所以我计算每个体素进行剔除需要很长时间。 当我有一个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。
答案 0 :(得分:2)
这6个find_if调用正在对循环的每次迭代进行线性搜索并比较这些向量。算法是N ^ 2的阶数,对于较大的情况,这将是缓慢的。
如果您的向量包含1000个元素,则find_if调用可能会在最坏的情况下比较6,000,000个元素。在2000个元素中,它跃升至24,000,000个比较。
如果您正在运行VS 2013 Professional或更高版本,只需为较小的案例配置代码,并查看算法花费的时间。解决性能问题的第一步是收集实际测量结果,以了解需要改进的地方。