Quando devo marcar GameObjects como estático?

9

Aqui está a documentação correspondente do Unity .

De acordo com as explicações das páginas de documentação do Unity sobre os Static GameObjects, às vezes marcar GameObjects como estático pode afetar o desempenho de maneira ruim (por exemplo, Static Batching causa mais uso de memória) .

Então, quando devo exatamente querer usar essas funcionalidades?

Desde já, obrigado.

Notas de rodapé:
Atualmente, estou desenvolvendo um jogo 2D de cima para baixo, com muitos Sprites e LineRenderers, mas sem objetos 3D (nem mesmo um quad). Todos os GameObjects estão sendo instanciados proceduralmente a partir de pré-fabricados pré-fabricados. Os LineRenderers são atualizados a partir dos scripts de cada quadro. E quase todos os Sprites estão se movendo constantemente. A maioria dos Sprites compartilha o mesmo material. Todos os LineRenderers também compartilham o mesmo material.

S. Tarık Çetin
fonte
11
NÃO PARA ÁRVORES NA FLORESTAS. Fomos mordidos por isso. LONGOS tempos de construção, dados MASSIVOS nos seus níveis. Nota: os documentos sobre isso destacam especificamente que você não deve usá-lo para florestas. :)
Almo
@Almo estou com o menino, pode entender esta dor
Hamza Hasan

Respostas:

6

Não existe uma regra rígida sobre quando você deve ou não tornar o GameObjects estático.

No mínimo, faça-o apenas para objetos que nunca se moverão durante a vida. Mas você precisa saber o que faz para avaliar se deve ou não.

Congela a malha nos dados da cena, para que você não tenha a sobrecarga do GameObject para o item. Isso significa um aumento no desempenho com o custo de alterar os dados da cena no tempo de construção e um custo extra de memória para o aplicativo final construído.

Isso é bom em muitos casos, embora possa causar problemas, por exemplo, com florestas. Além disso, significa que, em vez de armazenar os verts para a árvore uma vez e as cópias de desenho da GPU, ele deve duplicá-los em todo o lugar. Isso leva tempo durante a compilação e espaço no aplicativo. Nosso aplicativo passou de 3-4 GB para 300-400 MB quando tornamos as árvores não estáticas. O tempo de construção passou de 3-4 horas para 1 hora.

Tendo dito tudo isso! Seu jogo é 2d e provavelmente se beneficiaria da definição de GameObjects nas cenas como estáticas, desde que você não tenha muitos deles.

Almo
fonte
Não tornar a pré-fabricada estática também torna as instâncias estáticas?
S. Tarik Çetin
Não se você instancia-los em tempo de execução ... Como eles podem ser "estáticos"? Talvez eu esteja errado ... Vai checar.
Almo
2
Acabei de confirmar que, se a pré-fabricada estiver marcada como estática, as instâncias instanciadas também serão estáticas.
S. Tarik Çetin
1

Se eu disser em geral, tudo o que nunca se moverá (nem mesmo um pixel) em toda a vida do aplicativo deve ser marcado como estático. Geralmente é útil para assar luzes, caminhos de navmesh, etc.

Bem, se você estiver desenvolvendo sem objetos 3D, relaxe e se refresque. Não precisa se preocupar com renderização em tempo real, sombras ou outros problemas. Mesmo apagar a única luz vem com nova cena;)

Bem, qualquer um pode me corrigir se eu estiver errado em qualquer lugar.

Hamza Hasan
fonte
3
Isso é realmente errado para coisas como florestas. Reduz o número de chamadas ... mas divide todas as árvores na malha. Isso significa que, em vez de armazenar os verts para a árvore uma vez e a GPU desenhando cópias, ele deve duplicá-los em todo o lugar. Isso leva tempo durante a compilação e espaço no aplicativo. Nosso aplicativo passou de 3-4 GB para 300-400 MB quando tornamos as árvores não estáticas.
Almo
@Almo huggggeeeeee diferença #
Hamza Hasan
Eu acho que você deve esclarecer no início da sua resposta que você está recomendando isso apenas porque é um jogo 2D.
Almo
@ Almo Graças a você, agora eu acho que o lote estático é uma coisa prejudicial ao toque, como um forno que você não pode ter certeza de estar quente ou não. :)
S. Tarık Çetin
@Almo, sinta-se à vontade para editar este mano, se houver necessidade. Vá em frente
Hamza Hasan