假设我有一个if-语句,其中包含了一些不幸的财政检查。CPU是经过所有的检查,然后才把它加到一个假的或真的bool中,还是一旦找到真bool就终止并返回true?
我想知道,由于需要6种不同检查的3维对象截尾框,您可以作为一个连续的if语句执行,也可以作为一个包含多个check的单个if语句执行,如果它通过所有检查,即使第一个检查返回true,那么从长远来看,程序最好使用多个if语句而不是单个if语句,因为它会导致运行时的计算较少。
以下是为“具有任意边长的通用多维数据集对象”而进行的截尾代码的一部分,这是我们感兴趣的部分。我将发布这两个版本,第一个版本只使用if语句,第二个版本使用单个if:
for (int i = 0; i < 6; i++)
{
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC-r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC-r, zC+r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC+r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC+r, zC+r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC-r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC-r, zC+r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC+r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC+r, zC+r})) >= 0.0f) continue;
return false;
}for (int i = 0; i < 6; i++)
{
if ((DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC-rY, zC-rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC-rY, zC+rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC+rY, zC-rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC+rY, zC+rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC-rY, zC-rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC-rY, zC+rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC+rY, zC-rZ})) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC+rY, zC+rZ})) >= 0.0f)) continue;
return false;
}```发布于 2022-10-17 01:06:49
好的,感谢我收到的评论,我现在可以确定,在这种情况下,这两个变化实际上是相等的,因为一旦一次检查返回真,两者都会“短路”。这意味着我可以将单个if -语句变量拖出到一个返回if语句结果的不同函数中,并将该函数用作两种类型的框截尾中单个if语句中的条件(两边相等的框和边长不同的框)。
因此,与其拥有:
bool FrustumClass::CheckCube(float xC, float yC, float zC, float r)
{
// Check if any one point of the cube is in the view frustum.
for (int i = 0; i < 6; i++)
{
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC-r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC-r, zC+r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC+r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-r, yC+r, zC+r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC-r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC-r, zC+r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC+r, zC-r})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+r, yC+r, zC+r})) >= 0.0f) continue;
return false;
}
return true;
}
bool FrustumClass::CheckRectangle(float xC, float yC, float zC, float rX, float rY, float rZ)
{
// Check if any of the 6 planes of the rectangle (AABB/OBB) are inside the view frustum.
for (int i = 0; i < 6; i++)
{
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC-rY, zC-rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC-rY, zC+rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC+rY, zC-rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC-rX, yC+rY, zC+rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC-rY, zC-rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC-rY, zC+rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC+rY, zC-rZ})) >= 0.0f) continue;
if (DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(&frustumPlanes[i]), {xC+rX, yC+rY, zC+rZ})) >= 0.0f) continue;
return false;
}
return true;
}我可以:
bool FrustumClass::CheckCube(float xC, float yC, float zC, float r)
{
// Check if any one point of the cube is in the view frustum.
for (int i = 0; i < 6; i++)
{
if (boxCheck(&frustumPlanes[i], xC, yC, zC, r, r, r)) continue;
return false;
}
return true;
}
bool FrustumClass::CheckRectangle(float xC, float yC, float zC, float rX, float rY, float rZ)
{
// Check if any of the 6 planes of the rectangle (AABB/OBB) are inside the view frustum.
for (int i = 0; i < 6; i++)
{
if (boxCheck(&frustumPlanes[i], xC, yC, zC, rX, rY, rZ)) continue;
return false;
}
return true;
}
bool boxCheck(DirectX::XMFLOAT4* frustumPlane, float xC, float yC, float zC, float rX, float rY, float rZ)
{
return
(
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC - rX, yC - rY, zC - rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC - rX, yC - rY, zC + rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC - rX, yC + rY, zC - rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC - rX, yC + rY, zC + rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC + rX, yC - rY, zC - rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC + rX, yC - rY, zC + rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC + rX, yC + rY, zC - rZ })) >= 0.0f) ||
(DirectX::XMVectorGetX(DirectX::XMPlaneDotCoord(DirectX::XMLoadFloat4(frustumPlane), { xC + rX, yC + rY, zC + rZ })) >= 0.0f)
);
}这要容易得多,海事组织。
https://stackoverflow.com/questions/74091637
复制相似问题