[CF-AL] Utiliser le GPU pour effectuer les calculs des scripts.

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [CF-AL] Utiliser le GPU pour effectuer les calculs des scripts.

Message par Alesk » 17 Mai 2018 13:10

Yo !

Il y a moyen d'optimiser un peu ces lignes :

Code : Tout sélectionner

Vector3 dir = (transform.position - collision.gameObject.transform.position) * (Mathf.Pow((transform.position - collision.gameObject.transform.position).magnitude, 2) - transform.localScale.x);
collision.gameObject.GetComponent<Rigidbody2D>().AddForce(dir * force, ForceMode2D.Force);    
Dans un script exécuté très souvent, Il ne faut pas utiliser transform tel quel, ni GetComponent().
Appeler transform tel quel revient à faire un GetComponent<Transform>(). (si ça n'a toujours pas été optimisé en interne)

Et GetComponent() est une fonction relativement lourde à l'exécution.
Il vaut mieux exécuter GetComponent() une seule fois à l'initialisation de ton script (assigné à chaque gameobject) et stocker le résultat dans une propriété de ton script.
Et ensuite tu n'utilises plus que cette propriété qui pointera directement vers le bon component, sans avoir à refaire un get à chaque fois.

Comme tu as beaucoup d'entités qui exécutent ce code, ça peut faire une différence...

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [CF-AL] Utiliser le GPU pour effectuer les calculs des scripts.

Message par DevAmat » 17 Mai 2018 13:51

"Appeler transform tel quel revient à faire un GetComponent<Transform>()"

Je suis également curieux de savoir si c'est encore le cas...

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [CF-AL] Utiliser le GPU pour effectuer les calculs des scripts.

Message par boubouk50 » 17 Mai 2018 14:28

Transform hérite de Component comme n'importe quel autre Component, je pense que c'est resté comme raccourci (visuel/code) alors qu'ils ont virés les autres accès (renderer notamment) parce que le transform est obligatoire.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [CF-AL] Utiliser le GPU pour effectuer les calculs des scripts.

Message par simonj » 17 Mai 2018 15:46

De toute façon, si c'est de l'optimization que tu cherches, il faut forcément par de l'utilisation de cache pour les propriétés et éviter absolument les GetComponent. Même si le .transform est optimisé, si tu peux gagner quelques milise-condes ou quelques opérations, il ne faut pas cracher dessus.

Je pense que ça n'as pas évolué depuis le ce topic et globalement on ne sais pas comment ils ont implémenté le .transform, mais son utilisation est toujours plus rapide que GetComponent car c'est un accès à une propriété. Et un accès à une propriété est visiblement toujours plus rapide qu'un accès à une fonction. Donc le .transform sera toujours plus rapide qu'un GetComponent<Transform>(). Mais impossible de savoir le code exactement.

Selon le topic, on a dans l'ordre du moins opti au plus opti c'est :
1) GetComponent(typoeof(Transform))
2) GetComponent<Transform>()
3) .transform
4) La version en utilisant le cache.

Le mieux c'est de faire ton propre système de cache et de tester les perfs.

Répondre

Revenir vers « Scripting »