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 .