【问题标题】:Z ordering geometryZ 排序几何
【发布时间】:2010-09-11 04:49:40
【问题描述】:

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

我基本上在某些角度进行反​​向迭代,但我怎样才能使其保持一致,以便每个角度都快速变亮,一些直角如 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);
                    }
                }

            }
        }
    }
}


}

【问题讨论】:

    标签: c++ c opengl rendering


    【解决方案1】:

    哎呀。

    在不知道 GetCube 正在做什么的情况下,我无法开始猜测它对您的表现有何影响,但很清楚为什么事情会如此显着放缓。你做了很多不必要的工作。

    您可以通过采用不同的方法来消除大部分循环:忽略角度,并进行更简化的测试。对于ijk 的任何值,如果它标记了“玩家”后面的立方体,则不执行任何操作。仅此一项就可以平衡您的帧速率并简化您的循环。 (您不需要四组不同的嵌套循环!)

    更好的是,使用 空间图(例如八叉树或 kd 树)来存储立方体(或其他对象)的实例,并在树的节点上进行交叉测试。这样一来,您就可以一次性消除 大量 永远不会在截锥体内的对象,并显着提高性能。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2021-01-28
      • 2010-12-13
      • 2019-12-08
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多