我正在制作一个完全由立方体制成的游戏。我注意到,当我向前走时,它会快速闪亮,但如果我向相反方向旋转播放器,它的速度会慢得多。所以我所做的是基于角度排序,但我仍然得到一些有点慢的角度。我是这样做的:
我基本上在某些角度反向迭代,但我怎么能让它保持一致,所以每个角度都快速闪亮,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);
}
}
}
}
}
}
}
答案 0 :(得分:3)
让人惊讶。
在不知道GetCube
正在做什么的情况下,我无法猜测它是如何影响你的表现的,但很清楚为什么事情会如此显着减慢。你正在做很多不必要的工作。
只需采用不同的方法即可消除大部分循环:忽略角度,并进行更简化的测试。对于i
,j
和k
的任何值,如果它在“播放器”后面标记了一个多维数据集,则不执行任何操作。仅此一项就可以平衡你的帧速率并简化你的循环。 (您不需要四组不同的嵌套循环!)
更好的是,使用空间图 - 类似八叉树或kd树 - 来存储多维数据集(或其他对象)的实例,并在树的节点上进行交叉测试。这样,您可以同时消除巨大的对象,这些对象永远不会在平截头体内,并显着提高性能。