Les objets de jeu situés en dehors de la vue de la caméra consomment-ils des ressources informatiques / mobiles dans Unity?

11

Dans l'unité, supposons que j'ai des objets de jeu dans ma scène qui ne sont pas visibles par la caméra et ne sont donc pas rendus pendant le jeu.

Ces objets de jeu consomment-ils des ressources informatiques / mobiles lorsque le jeu est en cours d'exécution?

Où puis-je trouver des détails sur une telle utilisation?

Gissipi_453
la source

Réponses:

13

Ce que vous voulez, c'est un profileur de mémoire, qu'Unity possède. Ici: http://docs.unity3d.com/Manual/ProfilerMemory.html

Mais votre hypothèse est généralement juste, si un gameObject n'est pas visible par la caméra, il n'est pas dessiné, et il utilise moins de ressources, mais il doit quand même en consommer. Le gameObject existe toujours en mémoire, y compris toutes les textures, les scripts de modèles, etc. il consomme également du temps CPU à travers les méthodes Update et FixedUpdate (et diverses autres décrites ici ).

Mais généralement, le ralentissement majeur est le dessin, une petite quantité de temps CPU est utilisée pour déterminer que l'objet est en dehors du tronc de la caméra (limites), mais aucun dessin n'est fait.

Reuben Crimp
la source
5

Je pense que vous devriez également connaître Frullum Culling, ou le retrait de la surface cachée : http://en.wikipedia.org/wiki/Hidden_surface_determination

Il s'agit d'un élément important d'optimisation d'un jeu, car même si vos objets ne sont pas à l'intérieur du frustrum à une image donnée (c'est-à-dire visibles), certains appels de dessin (shaders) sont toujours lancés pour eux, ce qui diminue les performances.

Claudiu Apostol
la source
2
@ Gissipi_453, tout en effectuant des recherches dans ce sens, recherchez également des arbres quad et oct (tri des données spatiales)
Jon
3

La reponse courte est oui"; tout ce qui est prêt à être utilisé dans votre jeu prend de la mémoire.

L'autre chose à considérer est le coût de votre fréquence d'images:

5 objets, avec 5 textures distinctes, dessinés séparément nécessitent des changements d'état entre les deux. Vous pourrez peut-être économiser de la mémoire en déchargeant les textures qui ne sont pas utilisées.

En chargeant toutes les textures distinctes dans une seule texture d'atlas, l'empreinte mémoire devient fixe et vous ne pouvez plus décharger une texture individuelle. Une fois créé, il vous suffit de lier l'atlas une fois pour dessiner tous vos objets.

Un autre exemple est un simple sommet et tampon d'index. Si plusieurs des points basculent fréquemment entre visible et non, il est plus rapide de laisser les points "périmés" dans le tampon de sommet et de télécharger uniquement un nouveau tampon d'index.

Il existe de nombreuses autres fois où une augmentation du coût de la mémoire initiale est préférable à de nombreux changements d'état.

Si vous faites pivoter votre appareil photo, vous ne détruirez certainement pas ces objets à moins que vous ne le sachiez, cet appareil photo ne tournera pas en arrière pour vérifier cet objet. "- Katu

En utilisant un défilement latéral comme exemple, si vous ne pouvez vous déplacer que vers la droite (la carte défile uniquement vers la gauche), tout objet qui défile hors du côté gauche de l'écran peut être déchargé de manière permanente car vous ne l'utiliserez plus jamais. De plus, le contenu des objets peut être chargé à la demande juste avant que l'objet défile dans la vue de droite.

Jon
la source
1

Beaucoup de réponses prennent principalement en compte l'aspect graphique de votre question.

Le fait est qu'ils prendront diverses ressources, et leur coût par rapport au dessin de l'objet n'est pas fixe. Ce n'est pas aussi rare que certaines réponses impliquent que vos composants effectuent des opérations plus coûteuses que le dessin, mais vous pouvez minimiser le nombre de ressources qu'ils utilisent. Gardez également à l'esprit qu'un GameObject occupe une petite quantité de mémoire, tout comme ses composants. Les composants peuvent également faire des choses qui occupent une bonne partie de la mémoire.

Le moyen le plus simple de minimiser l'effet des composants hors écran est un système basé sur les rappels OnBecameVisible et OnBecameInvisible .

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

Bien sûr, cela est d'une utilité très limitée car il y a de nombreuses fois où vous voudrez qu'un objet hors écran affecte le jeu. Mais vous pouvez développer un modèle de ce type pour un système à grain fin capable de minimiser l'effet de vos calculs les plus coûteux. Même quelque chose d'aussi simple que de réduire quelque chose comme la qualité d'un script de suivi de chemin lorsque l'objet est hors écran peut entraîner de grandes économies à long terme.

Selali Adobor
la source
1

Il faut de la mémoire pour le maintenir en vie et mettre à jour sa position et d'autres propriétés.

Mais il ne consomme pas de ressources graphiques informatiques / mobiles car il n'est pas visible.

Alors oui, il consomme des ressources mémoire mais pas des ressources graphiques comme le fait un objet de jeu visible.

Yohann V.
la source
Merci beaucoup. C'est une réponse très directe que je cherchais.
Gissipi_453
0

Tout ce qui se trouve dans un programme consomme des ressources; Vous ne pensez pas que les programmes fonctionnent simplement sur des espoirs et des rêves, n'est-ce pas?

La question devrait être de savoir combien de ressources un objet de jeu consomme, et à cette fin, je pense que c'est une réponse assez solide: http://answers.unity3d.com/questions/280455/how-much-memory-a-gameobject- consume.html

Bref, ils consomment à eux seuls des ressources négligeables. Mais pourquoi voudriez-vous un tas d'objets de jeu simplement assis dans votre jeu sans rien faire? À la fin de la journée, ce que vous faites réellement `` faire '' à ces objets de jeu, c'est ce qui va provoquer toute sorte de frais généraux - et la quantité de ressources qui nécessite est très au cas par cas.

retourner vrai
la source
Merci beaucoup. Dois-je donc détruire les objets qui sont hors de vue de la caméra pendant le jeu?
Gissipi_453
1
Je pense que cette réponse n'essaie pas vraiment de répondre à votre question et est donc tout simplement fausse. Si vous faites pivoter votre appareil photo, vous ne détruirez certainement pas ces objets à moins que vous ne le sachiez, cet appareil photo ne tournera pas en arrière pour vérifier cet objet. Les mondes du jeu existent et le mouvement de l'IA, les lumières affectent l'environnement, même si vous ne les voyez pas.
Katu
@Katu, c'est aussi un point. Merci. À moins que l'objet n'ait pas du tout besoin d'être rendu, je ne devrais pas le détruire.
Gissipi_453
@Katu J'ai répondu à la question: "Ces objets de jeu (objets de ma scène qui ne sont pas visibles par la caméra) consomment-ils des ressources informatiques / mobiles lorsque le jeu est en cours?" Cette réponse étant: "Oui. Tout ce qui est dans un programme consomme des ressources". Et j'ai poursuivi en expliquant les impacts des objets de jeu vides sur la scène et les coûts des ressources.
retour vrai
2
@ Gissipi_453 Pour répondre à votre question, cela dépend entièrement de ce que font réellement les objets du jeu dans la scène, de la fréquence à laquelle ils sont créés / supprimés et d'autres considérations. Savoir quand optimiser est une compétence en soi, mais la règle de base est de ne pas s'en inquiéter jusqu'à ce qu'il y ait quelque chose à craindre. La surcharge des objets de jeu supplémentaires est presque nulle, alors ne vous inquiétez pas. Dans certains cas, si vous ajoutez / supprimez fréquemment des objets, le regroupement d'objets peut vous sauver la vie et, dans d'autres cas, vous pouvez effectuer d'autres astuces. Tout dépend si oui et quel est exactement le problème.
retour vrai