[MY-AL] Getcomponent dans une update, comment l'optimiser

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

[MY-AL] Getcomponent dans une update, comment l'optimiser

Message par Farstone » 10 Fév 2017 13:27

Bonjour/Bonsoir, j'aurais besoin d'aide pour éviter de me prendre la tête et de trouver mon code "sale" quand je sait qu'il peux être plus pratique, je m'explique.

J'ai 30 slots, et dans ses slots ce trouve un script qui contient le nombre d'objets dans le slot (un INT stocker dans le script).
Sa s'agence comme ça :
[parent]
Slot (image avec un script qui récupère le INT)
[children]
objet (image avec le script qui contient le INT)
nbObjet (qui contient le component Text et qui change quand Slot lui demande)

Donc le Slot a une fonction qui récupère le INT de objet et l'envoie en text a nbObjet, mais sa demande d'appeler la fonction de Slot pour récupérer le INT a chaque fois que le INT de objet change, ce qui est assez pénible dans mon cas, j'ai bien évidemment essayer de mettre la fonction (on va l'appeler récupérerINT sa serras plus simple) récupérerINT dans l'update mais comme elle contient un
int = GetComponentInChildren<Slot>.int elle qu'elle le ferras 30x par frames le jeu passe a 14FPS. J'aimerais savoir si il n'y a pas une méthode un peux plus optimisé ou il est nécessaire que j'appel cette fonction manuellement a chaque changement de INT et/ou changement d'objet (car oui chaque slot peux voir son objet se faire déplacer vers un autre slot).

J'espère que c'est clair, en tout cas sa ma l'air super mal expliqué, merci d'avance pour vos réponse.

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

Re: [MY-AL] Getcomponent dans une update, comment l'optimiser

Message par boubouk50 » 10 Fév 2017 14:21

Il faut réfléchir avec des Events. A la manière d'un OnValueChange ().
Je n'ai aucune compétence là-dedans pour créer un événement, mais cela est possible. Il faut trouver pour récupérer l'événement de changement de valeur de ton entier de slot.

Aussi, pour optimiser, au lieu de faire:
int = GetComponentInChildren<Slot>.int
Stocke le component plutôt et n'appelle que sa variable:
Slot slot = GetComponentInChildren<Slot> (); //Au Start () par exemple.
...
int slot.int;

La fonction GetComponent () est gourmande, il faut éviter de l'appeler continuellement.
"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

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [MY-AL] Getcomponent dans une update, comment l'optimiser

Message par Farstone » 10 Fév 2017 14:45

boubouk50 a écrit :Il faut réfléchir avec des Events. A la manière d'un OnValueChange ().
Je n'ai aucune compétence là-dedans pour créer un événement, mais cela est possible. Il faut trouver pour récupérer l'événement de changement de valeur de ton entier de slot.

Aussi, pour optimiser, au lieu de faire:
int = GetComponentInChildren<Slot>.int
Stocke le component plutôt et n'appelle que sa variable:
Slot slot = GetComponentInChildren<Slot> (); //Au Start () par exemple.
...
int slot.int;

La fonction GetComponent () est gourmande, il faut éviter de l'appeler continuellement.
En faite j'ai fait une petite erreur c'est GetComponentInChildren<nbObject> et le nbObject peux changer de slot, sachant qu'il n'y a pas obligatoirement un nbObject dans le slot si je le fait a son start j'aurais une erreur, je pense alors que le mieux reste d'appeler la fonction a chaque changement, car même un OnValueChange va ce cibler sur un nbObject qui peux changer de place, donc le text n'afficheras plus le bon int.

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

Re: [MY-AL] Getcomponent dans une update, comment l'optimiser

Message par boubouk50 » 10 Fév 2017 15:07

Tu prends peut-être le problème à l'envers.
Ce n'est pas le "Manager" qui va chercher l'info, mais ce sont les slots qui vont la lui envoyer.
Ainsi, les slots vont toujours pointer sur le même objet et ce sont eux qui vont appeler la fonction pour traiter la nouvelle information.
Au lieu de tout regrouper tes slots dans un seul script, fait un script commun à chaque slot qui va récupérer l'INT et l'envoyer au "Manager" qui lui va traiter les infos comme il le veut.

Publie ton script, si tu veux qu'on y jette un œil (ou deux).
"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

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [MY-AL] Getcomponent dans une update, comment l'optimiser

Message par Farstone » 10 Fév 2017 15:36

Alors en faite c'est déjà le cas, pour l'instant quand le INT bouge dans le script objet il GetComponentInParent<Slot> (au cas ou il aurait changer de slot entre temps) et il lui transmet sa valeur et slot ce charge ensuite de la transmettre au text dans le children, j'ai programmer le lancement de la fonction qui envoie a Slot partout la ou il était possible que la valeur int change et c'est ça qui me dérange un peux, je pense qu'un OnValueChange est une bonne idée dans l'optique ou elle serrait dans l'update de chacun des objet
Si la valeur change, alors envoyer au parent slot la fonction pour éditer le text selon "ce" INT, après étant donner que je travail sur un énorme projet il faut que tout soit plus ou moins optimiser, donc si le faite de mettre un OnValueChange dans l'update et trop gourmand comparer a lancer la fonction manuellement je ne pense pas la mettre. Car oui il faut quand même que la fonction OnValueChange vérifie si le int a changer une fois par frames je dirait, et je ne sait pas du tout les performances que requière la récupération d'un int 30xFPS on en reviens au problème principal, après peux être que je me fait des idée et que c'est vraiment très très simple pour Unity et le processeur a gérer. Ou alors je décide de le faire manuellement quitte a perdre un peux plus de temps selon les situation mais a garder le maximum d'optimisation.
EDIT : a noter aussi que si le gameobject objet change de slot il ne va pas transmettre sa valeur au nouveau slot (c'est en particulier ce qui ma prit un peux de temps a programmer et que j'aurais aimer éviter a l'avenir si je rajoute d'autres moyen de changer de slot etc...)

Répondre

Revenir vers « (C#) CSharp »