我正在做一个完全由立方体组成的游戏。我注意到当我向前走的时候,它跑得很快,但是如果我把玩家旋转到相反的方向,它就慢得要命。所以我所做的是基于角度的,但是我还是得到了一些有点慢的角度。我是这样做的:
我基本上是在某些角度进行反向迭代,但我如何使其一致,以便每个角度都快速变亮,一些直线角度,如88-92或178-182,真的很慢(透照)。
谢谢

SetPlayerPosition();


PlayerPosition.x -= 70;

PlayerPosition.y -= 20;

PlayerPosition.z -= 70;


collids.clear();
CBox* tmp;
float offset = -10;
if( Wrap(Camera.roty + offset) > 180 && Wrap(Camera.roty + offset) < 270)
{
    for(int i = 140; i > 0; --i)
    {
        for(int j = 0; j < 40; ++j)
        {
            for(int k = 0; k < 140; ++k)
            {

                tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);



                if(tmp != 0)
                {
                    if(frustum.sphereInFrustum(tmp->center,25) != NULL)
                    {
                        collids.push_back(tmp);
                    }
                }

            }
        }
    }
}
else if(Wrap(Camera.roty + offset) > 0 && Wrap(Camera.roty + offset) < 90 )
{
    for(int i = 0; i < 140; ++i)
    {
        for(int j = 0; j < 40; ++j)
        {
            for(int k = 140; k > 0; --k)
            {

                tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);



                if(tmp != 0)
                {
                    if(frustum.sphereInFrustum(tmp->center,25) != NULL)
                    {
                        collids.push_back(tmp);
                    }
                }

            }
        }
    }
}

else if(Wrap(Camera.roty + offset) > 90 && Wrap(Camera.roty + offset) < 180 )
{
    for(int i = 0; i < 140; ++i)
    {
        for(int j = 0; j < 40; ++j)
        {
            for(int k = 0; k < 140; ++k)
            {

                tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);



                if(tmp != 0)
                {
                    if(frustum.sphereInFrustum(tmp->center,25) != NULL)
                    {
                        collids.push_back(tmp);
                    }
                }

            }
        }
    }
}
else if (Wrap(Camera.roty + offset) > 270 && Wrap(Camera.roty + offset) < 360)
{
    for(int i = 140; i > 0; --i)
    {
        for(int j = 0; j < 40; ++j)
        {
            for(int k = 140; k > 0; --k)
            {

                tmp = GetCube(PlayerPosition.x + i, PlayerPosition.y + j, PlayerPosition.z + k);



                if(tmp != 0)
                {
                    if(frustum.sphereInFrustum(tmp->center,25) != NULL)
                    {
                        collids.push_back(tmp);
                    }
                }

            }
        }
    }
}


}

最佳答案

是的。
在不知道GetCube在做什么的情况下,我无法开始猜测它是如何影响你的表现的,但很清楚为什么事情会如此显著地放缓。你在做很多不必要的工作。
您可以通过采取不同的方法来消除大部分循环:忽略角度,并执行更简化的测试。对于任何值ijk,如果它在“player”后面标记了一个立方体,则不要执行任何操作。仅此一项就可以平衡帧率并简化循环。(不需要四组不同的嵌套循环!)
更好的方法是,使用空间图(类似于八叉树或kd树)来存储多维数据集(或其他对象)的实例,并对树的节点执行交集测试。这样,您就可以一次消除绝不会在截头台内的大量对象,并显著提高性能。

关于c++ - Z排序几何,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3689831/

10-11 18:32