Z排序几何

时间:2010-09-11 04:49:40

标签: c++ c opengl rendering

我正在制作一个完全由立方体制成的游戏。我注意到,当我向前走时,它会快速闪亮,但如果我向相反方向旋转播放器,它的速度会慢得多。所以我所做的是基于角度排序,但我仍然得到一些有点慢的角度。我是这样做的:

我基本上在某些角度反向迭代,但我怎么能让它保持一致,所以每个角度都快速闪亮,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);
                    }
                }

            }
        }
    }
}


}

1 个答案:

答案 0 :(得分:3)

让人惊讶。

在不知道GetCube正在做什么的情况下,我无法猜测它是如何影响你的表现的,但很清楚为什么事情会如此显着减慢。你正在做很多不必要的工作。

只需采用不同的方法即可消除大部分循环:忽略角度,并进行更简化的测试。对于ijk的任何值,如果它在“播放器”后面标记了一个多维数据集,则不执行任何操作。仅此一项就可以平衡你的帧速率并简化你的循环。 (您不需要四组不同的嵌套循环!)

更好的是,使用空间图 - 类似八叉树或kd树 - 来存储多维数据集(或其他对象)的实例,并在树的节点上进行交叉测试。这样,您可以同时消除巨大的对象,这些对象永远不会在平截头体内,并显着提高性能。