2010-09-11 3 views
0

Je fabrique un jeu entièrement fait de cubes. Je remarque que quand je marche en avant, il court rapidement, mais si je fais tourner le joueur dans la direction opposée, il est paralysant. Donc ce que j'ai fait est ordonné en fonction de l'angle, mais j'ai quand même quelques angles qui sont un peu lents. Voici comment je l'ai fait:Géométrie de commande Z

Je fondamentalement inverser itérer dans certains angles, mais comment pourrais-je le rendre cohérent, de sorte que chaque angle s'allège rapidement, certains des angles droits comme 88-92, ou 178-182 sont vraiment lent (overdraw).

Merci

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); 
        } 
       } 

      } 
     } 
    } 
} 


} 

Répondre

3

. Aïe Sans savoir ce que fait GetCube, je ne peux pas commencer à deviner comment cela affecte vos performances, mais il est assez clair que les choses ralentissent de manière significative. Vous faites beaucoup de travail inutile.

Vous pouvez éliminer la plupart de vos boucles simplement en adoptant une approche différente: Ignorez l'angle et effectuez des tests plus simples. Pour toute valeur de i, j et k, ne faites rien si elle marque un cube derrière le "joueur". Cela seul permettra d'équilibrer votre framerate et de simplifier vos boucles. (Vous n'avez pas besoin de quatre ensembles différents de boucles imbriquées!)

Mieux encore, utilisez un graphique spatiale - quelque chose comme un octree ou kd-tree - pour stocker les instances de vos cubes (ou d'autres objets), et Faites vos tests d'intersection sur les nœuds de l'arbre. De cette façon, vous pouvez éliminer d'énormes andains d'objets à la fois qui ne seront jamais à l'intérieur du tronc, et améliorer considérablement les performances.