Quelle est la taille limite du Tilemap Unity 2017.2?

17

J'ai parcouru la documentation sur la fonction Tilemap d'Unity 2017.2.

Unity limite-t-il le nombre maximal de tuiles qu'il prendra en charge pour un maillage de tilemap particulier?

Je sais que chaque mosaïque est instanciée une fois et utilisée pour texturer les quads sur le maillage Tilemap au moment de l'exécution, donc je suppose que la limite du nombre de quads du maillage dépend en fin de compte du matériel, et plus ou moins est arbitrairement élevée.

Est-ce une hypothèse correcte ou y a-t-il un bouchon dur dans le moteur?

Stephan
la source
1
Pourquoi le downvote? C'est une question légitime.
Philipp

Réponses:

25

Votre RAM est votre limite .

Les tests suivants ont été effectués sur un système avec ces spécifications:

  • Intel i5-6600
  • 16 Go de RAM
  • NVIDIA GeForce GTX 1070
  • Windows 7 Édition Familiale Premium

Voici un script que j'ai exécuté qui développe un tilemap en le remplissant avec une seule tuile (32x32 pixels). La méthode Grow()ajoute une autre colonne et une autre ligne à la carte actuelle. La méthode est appelée 100 fois à chaque mise à jour.

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 

    public int currentSize;


    void Start () {
       tilemap = GetComponent<Tilemap>;
        Grow();
    }

    void Update() {

        for (var i = 0; i < 100; i++) {
            Grow();
        }
        Debug.Log(currentSize);        
    }

    private void Grow() {
        for (int x = 0; x < currentSize; x++) {
            tilemap.SetTile(new Vector3Int(x, currentSize, 0), tile);
        }
        for (int y = 0; y < currentSize; y++) {
            tilemap.SetTile(new Vector3Int(currentSize, y, 0), tile);
        }
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);

        currentSize++;
    }
}

Après quelques minutes, mon ordinateur a manqué de mémoire et Unity s'est écrasé. À ce stade, il était de 8400 x 8400 (70 millions) de tuiles et Unity.exe consommait légèrement plus de 11 Go de RAM selon le gestionnaire de tâches.

Eh bien, mais qu'en est-il clairsemé cartes ?

Voici un script différent qui a placé une seule tuile en augmentant les coordonnées x et y par incréments de 100 tuiles:

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 
    public int currentSize;


    void Start () {
        tilemap = GetComponent<Tilemap>();
    }

    void Update() {
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
        currentSize+= 100;
    }    
}

L'empreinte mémoire d'Unity.exe a en fait très peu augmenté, ce qui laisse entendre que les cellules de jeu de tuiles vides ne nécessitent presque pas de RAM. Cependant, le FPS a continué de baisser au fur et à mesure que le jeu de tuiles grandissait. Il a atteint 60 Fps à 30000x30000, 30 Fps à 60000x60000 et 15 Fps à 90000x90000. Les Fps sont restés aussi bas lorsque j'ai supprimé le script pendant le test. Ce ralentissement n'était donc pas dû à la modification du tilemap. C'était simplement en le rendant. Donc, lorsque vous souhaitez créer un jeu de monde ouvert vraiment énorme, vous devrez peut-être utiliser plusieurs petits tilemaps que vous créez et détruisez au moment de l'exécution.

Conclusions: les tilemaps énormes mais surtout vides n'utilisent pas beaucoup de RAM, mais ils sont un goulot d'étranglement pour le rendu , même lorsque la plupart d'entre eux ne sont pas dans la fenêtre de la caméra.

J'ai ensuite expérimenté ce script qui génère des tilemaps avec une taille donnée:

public class TileTest : MonoBehaviour {

    public Tile tile;
    public int xSize;
    public int ySize;

    void Start () {
        Tilemap tilemap = GetComponent<Tilemap>();

        for (int x = 0; x < xSize; x++) {
            for (int y = 0; y < ySize; y++) {
                tilemap.SetTile(new Vector3Int(x, y, 0), tile);
            }
        }
    } 
}

J'ai utilisé ce script pour générer une carte 8192x8192. Cela a pris quelques minutes, mais lorsque le script a été terminé, il a fonctionné à 95 Fps.

Conclusion: des cartes avec des millions de tuiles sont réalisables, du moins sur les PC de jeu .

Philipp
la source
5
C'est la plus belle réponse que j'ai vue depuis longtemps. "Découvrons-le!" écrit des scripts pour marteler le système exécute l' ordinateur de script commence à fumer "On dirait que cela ne vous limite pas!" Merci @Philipp!
Stephan
Quelle était la fréquence d'images lors de la génération du test 8192 ^ 2? Je suis curieux de voir à quel point les efforts de génération ont embourbé le système.
Stephan
1
@Stephan Zero FPS. Comme je l'ai dit, la génération prend plusieurs minutes. Et parce que ce script ne laisse pas sa Updateméthode lors de la génération, le jeu et l'éditeur Unity se figent jusqu'à la fin de la génération. Si vous voulez que votre jeu soit réactif pendant la génération de carte, déplacez la génération vers une coroutine qui génère un morceau à la fois et donne entre eux.
Philipp
@Stephan Et au fait, il pourrait être plus rapide d'utiliser SetTilesBlock pour définir toutes les tuiles à la fois. Mais générer rapidement la carte de test n'était pas mon objectif ici.
Philipp
Oh! duh, ok. Pour une raison quelconque, je pensais que cela allait interrompre. Voilà une pensée intéressante. Je vais devoir jouer avec ça ce week-end. Il ne semble pas y avoir énormément de résultats sur cette fonctionnalité depuis qu'elle est si nouvelle. Merci pour la réponse complète! Cela a déjà attiré beaucoup d'attention. Aider la postérité!
Stephan