首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中如何处理逻辑的\操作?

在C++中如何处理逻辑的\操作?
EN

Stack Overflow用户
提问于 2022-10-17 00:48:10
回答 1查看 42关注 0票数 0

假设我有一个if-语句,其中包含了一些不幸的财政检查。CPU是经过所有的检查,然后才把它加到一个假的或真的bool中,还是一旦找到真bool就终止并返回true?

我想知道,由于需要6种不同检查的3维对象截尾框,您可以作为一个连续的if语句执行,也可以作为一个包含多个check的单个if语句执行,如果它通过所有检查,即使第一个检查返回true,那么从长远来看,程序最好使用多个if语句而不是单个if语句,因为它会导致运行时的计算较少。

以下是为“具有任意边长的通用多维数据集对象”而进行的截尾代码的一部分,这是我们感兴趣的部分。我将发布这两个版本,第一个版本只使用if语句,第二个版本使用单个if:

代码语言:javascript
运行
复制
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;
    }
代码语言:javascript
运行
复制
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;
    }```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-17 01:06:49

好的,感谢我收到的评论,我现在可以确定,在这种情况下,这两个变化实际上是相等的,因为一旦一次检查返回真,两者都会“短路”。这意味着我可以将单个if -语句变量拖出到一个返回if语句结果的不同函数中,并将该函数用作两种类型的框截尾中单个if语句中的条件(两边相等的框和边长不同的框)。

因此,与其拥有:

代码语言:javascript
运行
复制
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;
}

我可以:

代码语言:javascript
运行
复制
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)
    );
}

这要容易得多,海事组织。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74091637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档