2017-07-15 1 views
0

J'ai besoin d'aide avec mon code sur ma 2D isométrique en Monogame. J'ai réussi à créer un moteur de tuiles de 500 * 750 (format 128x64) à 60FPS (mais mon ordinateur est en feu), mais le problème est sur les plus grandes tailles où les FPS tombent beaucoup.Monogame - Tuiles isométriques, faible FPS sur les grandes cartes

Je vais d'abord charger toutes les tuiles dans la liste des tuiles:

for (int i = 0; i < 500; i++) 
     { 
      for (int j = 0; j < 750; j++) 
      { 
       int x = j * 128/2; 
       int y = i * 64; 

       int ix = x - y; 
       int iy = (x + y)/2; 
       tiles.Add(new Tile("001", new Vector2(ix, iy), new Vector2(j, i), spriteBatch, spriteFont, content)); 
      } 
     } 

puis quand je dois dessiner je suis méthode Colling qui attirera les tuiles visibles:

public void drawMap(Camera camera) 
    { 
     if (spriteBatch != null) 
     { 
      tilesDrawed = 0; 
      foreach (Tile tile in tiles) // the problem 
      { 
       if (camera.isTileVisibe((int)tile.position.X, (int)tile.position.Y)) 
       { 
        Point isoCoords = new Point((int)tile.position.X, (int)tile.position.Y); 
        isoCoords.X -= camera.xOffset; 
        isoCoords.Y -= camera.yOffset; 

        tile.drawTile(isoCoords); 
        tilesDrawed++; 
       } 
      } 


     } 
    } 

Je sais que les question est que je passe par chaque carreau posible. Mais je ne sais pas comment aborder cela: /. Je pensais que je vais ajouter à la liste des tuiles seulement visibles, mais à la fin c'est pareil, il faut que j'aille penser à toutes les tuiles pour vérifier si elles sont visibles à la caméra.

Résultat: Result

je vraiment besoin d'aide, je suis assis sur ce depuis longtemps.

Merci.

modifier: donc je remplacer mon foreach sur everytile avec seulement ceux qui sont visibles:

  List<Tile> visibleTiles = tiles.FindAll(r => (
          (int)r.position.X + 128 > camera.width + camera.xOffset - camera.width && (int)r.position.X - 128 < camera.width + camera.xOffset) && 
          ((int)r.position.Y + 64 > camera.height + camera.yOffset - camera.height && r.position.Y - 64 < camera.height + camera.yOffset)); 


      foreach (Tile tile in visibleTiles) 
      { 
       Point isoCoords = new Point((int)tile.position.X, (int)tile.position.Y); 
       isoCoords.X -= camera.xOffset; 
       isoCoords.Y -= camera.yOffset; 

       tile.drawTile(isoCoords); 
       tilesDrawed++; 
      } 

aucune aide, il est findAll je pense lent, il est juste un peu plus rapide.

je suis passé à tableau 2D je dois trouver des tuiles visibles .. quand je suis avec le calcul:

  int si = (-camera.xOffset - tileWidth)/64; 
      int ei = (-camera.xOffset + camera.width + tileWidth)/64; 
      int sj = (-camera.yOffset - tileHeight)/64; 
      int ej = (-camera.yOffset + camera.height + tileHeight)/64; 

      Point start = twoDToIso(new Point(si,sj)); 
      Point end = twoDToIso(new Point(ei, ej)); 

il est peu hors ,, si elle va outfobound je vais vérifier si la tuile existe .

Je ne peux pas le découvrir .. assis ici en pensant à 03h00

Répondre

0

Si vous voulez dessiner une carte 2D, pourquoi stockez-vous pas en 2D? Un tableau à deux dimensions serait bien pour cela. De cette façon, vous pouvez calculer quelle partie de la zone que vous souhaitez rendre et utiliser 2 pour que les boucles parcourent le tableau.

N'utilisez jamais LinQ dans les applications en temps réel, uniquement si vous l'appelez une fois, mais pas à chaque appel de tirage.

Vous pouvez ajouter une matrice de transformation à votre caméra afin de pouvoir ignorer l'ajout de mouvement et déplacer à la place les sommets des tuiles de votre SpriteBatch.

+0

Merci pour la réponse, iso je l'ai mis dans tile [] [] tableau 2d, maintenant j'essaie de calculer ce qui doit être dessiné .. pas encore bon:/ –

+0

Vous avez optimisé votre dessin avant, en limitant la nombre de tuiles dessinées. Utilisez le même algorithme mais utilisez-le pour obtenir la zone que vous voulez voir à la place. –

+0

hmm, je suis vraiment perdu en ce moment la méthode avant était limitée mais si je dessine une tuile spécifiée c'est plus efficace, j'ai essayé de calculer le coin en haut à droite et de dessiner ça mais ça n'est pas correct pour une raison quelconque caluculer mal et le nombre de tuiles dessinées augmente. –