Merci pour cette vidéo, je vais regarder ce soir en détail.
Dans un RTS on a besoin de connaitre si un adversaire est assez proche pour lui tirer dessus ou pour l'attaquer.
Pour ça il y a 2 solutions à mon sens
RayCast et SphereCast
J'avais utilisé SphereCast pour faire cela, ce qui fonctionne très bien avec peu d'objets et en limitant le nombre de SphereCast par seconde.
J'ai ensuite utilisé RayCast, en faisant tourner le rayon petit a petit soit en l'incrémentant, soit avec un random, pas mieux au niveaux perfs pour un grand nombre d'objet.
A savoir qu'uniquement un seul Thread est utilisé par Unity, donc en effet niveau CPU on l'exploite pas à fond.
J'ai utilisé des Coroutines et des appels dans Update et FixedUpdate.
Tableau perso d'objet
J'ai ensuite créé une méthode qui récupère tous les objets 10 fois par seconde et qui les range dans 2 tableaux(joeur1,joeur2), et au lieu d'appeler RayCast , j'appel une méthode via un Thread qui va lire tout le tableau pour trouver l'adversaire le plus proche.
Le gain de performance est spectaculaire, je suis passé de 33img/s a 48img/s.
Le problème est que chaque objet lance son propre Thread, et ce n'est pas très stable.
Apres 8H de développement, J'ai créé une Class static pour gérer tout ça dans un seul Thread.
J'ai encore gagné un peu en perf, avec 450 unités je suis maintenant en dessus des 50img/s en mode défense(detection ennemies), et surtout en fiabilité, plus aucun problème de saccade.
A savoir que Unity ont aussi interdit les accès à leur objets par un autre Thread que le leur, pour ne pas rendre le moteur instable, ce qui complexifie mon code car je dois copié le contenu des objets au lieu de juste y accéder.