Qual é o limite de tamanho para o Unity 2017.2 Tilemap?

17

Estou pesquisando a documentação do recurso Tilemap do Unity 2017.2.

O Unity limita o número máximo de blocos que ele suporta para uma malha de mapa de blocos específica?

Eu sei que cada bloco é instanciado uma vez e usado para texturizar os quadríceps na malha Tilemap em tempo de execução, portanto, eu acho que o limite de contagem de quadras de malha depende em última análise do hardware e mais ou menos é arbitrariamente alto.

Essa é uma suposição correta ou existe uma tampa rígida no mecanismo?

Stephan
fonte
1
Por que o voto negativo? Esta é uma questão legítima.
Philipp

Respostas:

25

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 .

Philipp
fonte
5
Esta é a resposta mais bonita que já vi há muito tempo. "Vamos descobrir!" escreve scripts para martelar o sistema executa o computador de script começa a fumar "Parece que isso não limita você!" Obrigado @Philipp!
Stephan
Qual foi a taxa de quadros durante a geração do teste 8192 ^ 2? Estou curioso para saber quanto os esforços de geração atrapalharam o sistema.
21717 Stephan Stephan
1
@Stephan Zero FPS. Como eu disse, a geração leva vários minutos. E como esse script não deixa seu Updatemétodo durante a geração, o jogo e o editor do Unity congelam até a geração terminar. Se você deseja que seu jogo seja responsivo durante a geração do mapa, mova a geração para uma corotina que gere um pedaço de cada vez e ceda entre eles.
Philipp
@ Stephan E, a propósito, pode ser mais rápido usar o SetTilesBlock para definir todos os blocos de uma só vez. Mas gerar o mapa de teste rapidamente não era meu objetivo aqui.
Philipp
Oh! ok Por alguma razão, eu estava pensando que isso iria interromper. Esse é um pensamento interessante. Vou ter que brincar com isso neste fim de semana. Ainda não parece haver muitos resultados impressionantes sobre esse recurso, já que é tão novo. Obrigado pela resposta completa! Já ganhou muita atenção. Ajudando a posteridade!
21717 Stephan Stephan