2010-09-11 69 views
0

我正在製作完全由立方體制成的遊戲。我注意到,當我向前走時,它快速閃爍,但如果我沿相反的方向旋轉播放器,它的速度會變慢。所以我所做的是根據角度排序的,但我仍然會得到一些有點慢的角度。這是我是如何做到的:Z排列幾何

我基本上是在某些角度反向迭代,但我怎麼能使它一致,以便每個角度都快速減輕,一些像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); 
        } 
       } 

      } 
     } 
    } 
} 


} 

回答

3

讓人驚訝。

不知道GetCube在做什麼,我不能開始猜測它是如何影響你的表現的,但很明顯爲什麼事情會如此顯着地放緩。你正在做很多不必要的工作。

您可以簡單地採用不同的方法消除大部分循環:忽略角度,並進行更簡化的測試。對於任何值i,jk,如果它標記「玩家」背後的立方體,則不做任何操作。僅憑這一點,你的幀率就會更高,並簡化你的循環。 (你並不需要四組不同的嵌套循環!)

更妙的是,使用空間圖形 - 有點像一個八叉樹或kd樹 - 存儲您的立方體的情況下(或其他物體),和在樹的節點上進行相交測試。這樣,您就可以一次性刪除大量的物體,這些物體將永遠不會位於平截頭體內,從而顯着提高性能。