Re: [MY - AL] Subdivision de mesh en zones
Publié : 27 Nov 2018 01:26
Vraiment content que ça fonctionne sur ton projet.
C'est vrai que je n'avais pas trop optimisé mais plutôt écris à la vas vite.^^
Pour optimiser tu peux déjà commencer par baisser le nombre d'itération de recherche de centerZone. j'avais mis une grande valeur ne connaissant pas les données de ton mesh. tu peux réduire par palier de 100 et tester à chaque fois. dès que tu remarque des zones trop grandes par rapport à d'autre, remonte de 100 pour être garder une marge.
Pour la void FindCenter, tu peux gagner aussi un peu.la distance d'un centre a l'autre est calculée avec un Vector3.magnitude, pour que ta distance minimal soit une valeur en unité réel ( 1 c'est un mètre). Cependant pour juste de la comparaison de distance, il est plus rapide d'utiliser un Vector3.sqrtMagnitude qui est plus rapide. Mais dans ce cas bien penser a mettre au carré ta distance minimal. Par exemple pour des zones de 1.5, il faudra comparer les sqrtMagnitude avec 2.25. FindCenter(1.5f) => FindCenter(2.25f);
Ensuite en travaillant avec les mesh, il est préférable de stocker les donnée une fois plutot que d’accéder au mesh a chaque fois. Ici tu stock juste le _nbVertex, et pour chaque vertex que tu test par rapport aux centre, utilise _planeteMesh.vertices(i) qui est une opération lente. Regarde mon code, je n’accède au mesh juste pour en sortir les vertex, que je met dans un array. et ensuite je n'utilise plus que cet array au lieu d’accéder au mesh pour chaque calcul.
Une autre optimisation, c'est du coté de foreach qui sont si ma mémoire est bonne , plus couteux en ressource et certainement en temps par rapport à mon script qui utilisait les for(int i ... etc ), c'est certes un peu plus long a écrire, mais plus performant.
C'est vrai que je n'avais pas trop optimisé mais plutôt écris à la vas vite.^^
Pour optimiser tu peux déjà commencer par baisser le nombre d'itération de recherche de centerZone. j'avais mis une grande valeur ne connaissant pas les données de ton mesh. tu peux réduire par palier de 100 et tester à chaque fois. dès que tu remarque des zones trop grandes par rapport à d'autre, remonte de 100 pour être garder une marge.
Pour la void FindCenter, tu peux gagner aussi un peu.la distance d'un centre a l'autre est calculée avec un Vector3.magnitude, pour que ta distance minimal soit une valeur en unité réel ( 1 c'est un mètre). Cependant pour juste de la comparaison de distance, il est plus rapide d'utiliser un Vector3.sqrtMagnitude qui est plus rapide. Mais dans ce cas bien penser a mettre au carré ta distance minimal. Par exemple pour des zones de 1.5, il faudra comparer les sqrtMagnitude avec 2.25. FindCenter(1.5f) => FindCenter(2.25f);
Ensuite en travaillant avec les mesh, il est préférable de stocker les donnée une fois plutot que d’accéder au mesh a chaque fois. Ici tu stock juste le _nbVertex, et pour chaque vertex que tu test par rapport aux centre, utilise _planeteMesh.vertices(i) qui est une opération lente. Regarde mon code, je n’accède au mesh juste pour en sortir les vertex, que je met dans un array. et ensuite je n'utilise plus que cet array au lieu d’accéder au mesh pour chaque calcul.
Une autre optimisation, c'est du coté de foreach qui sont si ma mémoire est bonne , plus couteux en ressource et certainement en temps par rapport à mon script qui utilisait les for(int i ... etc ), c'est certes un peu plus long a écrire, mais plus performant.