C++ Z序几何
我正在制作一个完全由立方体组成的游戏。我注意到,当我向前走的时候,它跑得很快,但是如果我把播放器向相反的方向旋转,它的速度会非常慢。所以我所做的是根据角度排序的,但我仍然得到一些角度有点慢。我是这样做的: 我基本上是在某些角度进行反向迭代,但如何使其一致,使每个角度都变快,一些直线角度,如88-92或178-182,非常慢(超速) 谢谢C++ Z序几何,c++,c,opengl,rendering,C++,C,Opengl,Rendering,我正在制作一个完全由立方体组成的游戏。我注意到,当我向前走的时候,它跑得很快,但是如果我把播放器向相反的方向旋转,它的速度会非常慢。所以我所做的是根据角度排序的,但我仍然得到一些角度有点慢。我是这样做的: 我基本上是在某些角度进行反向迭代,但如何使其一致,使每个角度都变快,一些直线角度,如88-92或178-182,非常慢(超速) 谢谢 SetPlayerPosition(); PlayerPosition.x -= 70; PlayerPosition.y -= 20; PlayerP
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);
}
}
}
}
}
}
}
SetPlayerPosition();
PlayerPosition.x-=70;
玩家位置y-=20;
播放位置z-=70;
collids.clear();
CBox*tmp;
浮动偏移量=-10;
如果(包裹(Camera.roty+偏移量)>180和包裹(Camera.roty+偏移量)<270)
{
对于(int i=140;i>0;--i)
{
对于(int j=0;j<40;++j)
{
对于(int k=0;k<140;++k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
否则如果(包裹(Camera.roty+偏移量)>0和包裹(Camera.roty+偏移量)<90)
{
对于(int i=0;i<140;++i)
{
对于(int j=0;j<40;++j)
{
对于(int k=140;k>0;--k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
否则,如果(包裹(Camera.roty+偏移量)>90和包裹(Camera.roty+偏移量)<180)
{
对于(int i=0;i<140;++i)
{
对于(int j=0;j<40;++j)
{
对于(int k=0;k<140;++k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
否则如果(包裹(Camera.roty+偏移量)>270和包裹(Camera.roty+偏移量)<360)
{
对于(int i=140;i>0;--i)
{
对于(int j=0;j<40;++j)
{
对于(int k=140;k>0;--k)
{
tmp=GetCube(PlayerPosition.x+i,PlayerPosition.y+j,PlayerPosition.z+k);
如果(tmp!=0)
{
如果(平截头体球壳(tmp->center,25)!=NULL)
{
碰撞。推回(tmp);
}
}
}
}
}
}
}
Yikes
在不知道GetCube正在做什么的情况下,我无法猜测它是如何影响您的性能的,但很清楚为什么事情会如此显著地放缓。你在做很多不必要的工作
您只需采取不同的方法即可消除大部分循环:忽略角度,并进行更简化的测试。对于i
、j
和k
的任何值,如果它在“播放器”后面标记一个立方体,请不要执行任何操作。仅此一项就可以平衡帧率并简化循环。(您不需要四组不同的嵌套循环!)
更好的方法是,使用空间图(类似八叉树或kd树)来存储多维数据集(或其他对象)的实例,并在树的节点上进行相交测试。通过这种方式,您可以一次消除绝不会位于平截头体内部的大量对象,并显著提高性能。Yikes
在不知道GetCube正在做什么的情况下,我无法猜测它是如何影响您的性能的,但很清楚为什么事情会如此显著地放缓。你在做很多不必要的工作
您只需采取不同的方法即可消除大部分循环:忽略角度,并进行更简化的测试。对于i
、j
和k
的任何值,如果它在“播放器”后面标记一个立方体,请不要执行任何操作。仅此一项就可以平衡帧率并简化循环。(您不需要四组不同的嵌套循环!)
更好的方法是,使用空间图(类似八叉树或kd树)来存储多维数据集(或其他对象)的实例,并在树的节点上进行相交测试。这样,您可以一次消除绝不会位于平截头体内部的大量对象,并显著提高性能