Os Objetos de Jogo que estão fora da visualização da câmera consomem recursos de computador / dispositivos móveis no Unity?

11

Na unidade, vamos supor que eu tenha alguns Objetos de Jogo em minha cena que não são visíveis para a câmera e, portanto, não são renderizados enquanto o jogo está em execução.

Esses objetos de jogo consumirão recursos de computador / dispositivos móveis quando o jogo estiver em execução?

Onde posso encontrar detalhes sobre o uso como esses?

Gissipi_453
fonte

Respostas:

13

O que você deseja é um criador de perfil de memória, que Unity possui. Aqui: http://docs.unity3d.com/Manual/ProfilerMemory.html

Mas sua suposição está correta, se um gameObject não estiver visível para a câmera, ele não é desenhado e usa menos recursos, mas ainda deve consumir alguns. O gameObject ainda existe na memória, incluindo todas as texturas, scripts de modelos etc. também consome tempo da CPU através dos métodos Update e FixedUpdate (e vários outros descritos aqui ).

Mas geralmente a principal desaceleração é o desenho, uma pequena quantidade de tempo da CPU é usada para determinar que o objeto está fora do limite da câmera (limites), mas nenhum desenho é feito.

Reuben Crimp
fonte
5

Eu acho que você também deve saber sobre Frustrum Culling, ou remoção da superfície hiden: http://en.wikipedia.org/wiki/Hidden_surface_determination

Esta é uma parte importante da otimização de um jogo, porque, mesmo que seus objetos não estejam dentro do frustrum em um determinado quadro (ou seja, visível), algumas chamadas de chamada (shaders) ainda são lançadas para eles, diminuindo o desempenho.

Claudiu Apostol
fonte
2
@ Gissipi_453, enquanto pesquisava ao longo destas linhas, também de investigação quad e Out-árvores (dados espaciais ordenação)
Jon
3

A resposta curta é sim"; tudo o que estiver pronto para ser usado no seu jogo está ocupando memória.

A outra coisa a considerar é o custo da sua taxa de quadros:

5 objetos, com 5 texturas separadas, desenhados separadamente requerem alterações de estado intermediárias. Você pode economizar memória descarregando texturas que não são usadas.

Ao carregar todas as texturas separadas em uma única textura de atlas, o espaço ocupado na memória fica fixo e você não pode mais descarregar uma textura individual. Uma vez criado, você só precisa vincular o atlas uma vez para desenhar todos os seus objetos.

Outro exemplo é um buffer simples de vértice e índice. Se muitos dos pontos alternam frequentemente entre visíveis e não, é mais rápido deixar os pontos "obsoletos" no buffer de vértice e carregar apenas um novo buffer de índice.

Há muitos outros momentos em que um custo inicial de memória aumentado é preferível a muitas alterações de estado.

Se você girar sua câmera, você definitivamente não destruirá esses objetos, a menos que saiba, essa câmera não girará de volta para verificar esse objeto. "- Katu

Usando um controle lateral como exemplo, se você puder apenas mover para a direita (o mapa apenas rola para a esquerda), qualquer objeto que role para fora do lado esquerdo da tela poderá ser descarregado permanentemente, pois você nunca o usará novamente. Além disso, o conteúdo dos objetos pode ser carregado por demanda logo antes de o objeto rolar para exibição à direita.

Jon
fonte
1

Muitas respostas estão considerando principalmente o aspecto gráfico da sua pergunta.

O fato é que eles ocuparão vários recursos, e o quão caro eles são comparados ao desenho do objeto não é fixo. Não é tão incomum quanto algumas respostas implicam para que seus componentes façam operações mais caras do que o desenho, mas você pode minimizar quantos recursos eles usam. Lembre-se também de que um GameObject ocupa uma pequena quantidade de memória, assim como seus componentes. Os componentes também podem estar fazendo coisas que ocupam um pouco de memória.

A maneira mais simples para minimizar o efeito de componentes fora da tela é um sistema baseado na OnBecameVisible e OnBecameInvisible retornos de chamada.

void OnBecameVisible()
{
    myComplexComponent.enabled = true;
}
void OnBecameInvisble()
{
    myComplexComponent.enabled = false;
}

Claro, isso é de utilidade muito limitada, pois há muitas vezes que você deseja que um objeto fora da tela afete o jogo. Mas você pode expandir um padrão desse tipo para um sistema refinado capaz de minimizar o efeito de seus cálculos mais caros. Mesmo algo tão simples como reduzir algo como a qualidade de um caminho após o script quando o objeto está fora da tela pode resultar em grandes economias a longo prazo.

Selali Adobor
fonte
1

É preciso memória para mantê-lo vivo e atualizar sua posição e outras propriedades.

Mas ele não consome recursos gráficos para computadores / dispositivos móveis, pois não é visível.

Portanto, sim, ele consome recursos de memória, mas não recursos gráficos como um Objeto de Jogo visível.

Yohann V.
fonte
Muito obrigado. Esta é uma resposta muito direta que eu estava procurando.
Gissipi_453
0

Qualquer coisa que esteja em um programa consome recursos; Você não acha que os programas funcionam apenas com esperanças e sonhos, acha?

A questão deve ser a quantidade de recursos que um objeto de jogo consome e, para esse fim, acho que essa é uma resposta bastante sólida: http://answers.unity3d.com/questions/280455/how-much-memory-a-gameobject- consume.html

Em suma, eles consomem recursos insignificantes por conta própria. Mas por que você quer um monte de objetos de jogo apenas no seu jogo sem fazer nada? No final das contas, o que você realmente faz com que esses objetos de jogo 'façam' é o que causará qualquer tipo de sobrecarga - e a quantidade de recursos necessários requer muito caso a caso.

retornar verdadeiro
fonte
Muito obrigado. Então, devo destruir objetos que estão fora da vista da câmera enquanto o jogo está rodando?
Gissipi_453 31/03
1
Eu acho que essa resposta realmente não tenta responder à sua pergunta e, portanto, está completamente errada. Se você girar sua câmera, você definitivamente não destruirá esses objetos, a menos que saiba, essa câmera não girará de volta para verificar esse objeto. Existem mundos de jogo e o movimento da IA, as luzes afetam o ambiente, mesmo que você não as veja.
Katu
@ Katu, isso também é um ponto. Obrigado. A menos que o objeto não precise ser renderizado, eu não devo destruí-lo.
31515 Gissipi_453 31/03
@Katu, eu respondi à pergunta: "Esses objetos de jogo (objetos na minha cena que não são visíveis para a câmera) estarão consumindo recursos de computador / dispositivos móveis quando o jogo estiver em execução?" Essa resposta é: "Sim. Tudo o que estiver em um programa consome recursos". E passei a explicar os impactos dos objetos vazios do jogo na cena e os custos de recursos.
return true
2
@ Gissipi_453 Para responder à sua pergunta, isso depende totalmente do que os objetos do jogo em cena realmente estão fazendo, da frequência com que são criados / excluídos e de outras considerações. Saber quando otimizar é uma habilidade por si só, mas a regra geral é não se preocupar com isso, até que haja algo com que se preocupar. A sobrecarga de objetos extras do jogo é quase nada, então não se preocupe. Em alguns casos, se você estiver adicionando / removendo objetos com frequência, o pool de objetos pode ser um salva-vidas e, em outros casos, você pode fazer outros truques. Tudo depende se existe e qual é exatamente o problema.
return true