Sua RAM é o seu limite .
Os seguintes testes foram realizados em um sistema com essas especificações:
- Intel i5-6600
- 16 GB de RAM
- NVIDIA GeForce GTX 1070
- Windows 7 Home Premium
Aqui está um script que eu executei que aumenta um mapa de blocos, preenchendo-o com um único bloco (32 x 32 pixels). O método Grow()
adiciona outra coluna e outra linha ao mapa atual. O método é chamado 100 vezes a cada atualização.
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++;
}
}
Depois de alguns minutos, meu computador ficou sem memória e o Unity travou. Nesse ponto, ele estava em 8400x8400 (70 milhões) de blocos e o Unity.exe estava consumindo um pouco acima de 11 GB de RAM, de acordo com o gerenciador de tarefas.
Bem, mas e os mapas esparsos ?
Aqui está um script diferente que colocou um único bloco no aumento das coordenadas x e y em incrementos de 100 blocos:
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;
}
}
A pegada de memória do Unity.exe na verdade aumentou muito pouco, o que sugere que as células vazias do conjunto de peças quase não requerem RAM. No entanto, o FPS continuou caindo à medida que o conjunto de peças crescia. Atingiu 60 Fps em 30000x30000, 30 Fps em 60000x60000 e 15 Fps em 90000x90000. Os Fps permaneceram baixos quando removi o script enquanto o jogo de teste estava em execução. Portanto, essa desaceleração não foi causada pela alteração do mapa de blocos. Foi simplesmente por renderizá-lo. Portanto, quando você deseja criar um jogo de mundo aberto realmente enorme, talvez seja necessário usar vários mapas de peças menores, criados e destruídos em tempo de execução.
Conclusões: mapas de tile enormes, mas geralmente vazios, não usam muita RAM, mas são um gargalo de renderização , mesmo quando a maioria não está na janela de exibição da câmera.
Então experimentei esse script que gera mapas de telha com um determinado tamanho:
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);
}
}
}
}
Eu usei esse script para gerar um mapa de 8192x8192. Demorou alguns minutos, mas quando o script foi concluído, ele funcionava a 95 Fps.
Conclusão: Mapas com milhões de blocos são viáveis, pelo menos em PCs para jogos .