Page 4 sur 7

Re: [C#] GLWireframe

Publié : 22 Fév 2013 12:03
par axel
J'ai également testé cette nouvelle version.
Effectivement comme tu le disais avant le first baking est plus efficace avec beaucoup d'objet à peu de face, que peu d'objet avec plus de face.
Sur mes 7 objets comprenant en tout 22 000 sommets (29 891 triangles) voici les stats:

En remove edge true:
first baking : 70365 ms (contre 4500ms pour Max qui à 1 fois et demi plus de faces que moi)
edges : 42173
fps : 39 FPS

En remove edge false:
first baking : 49262 ms (quand même...)
edges : 89673
fps : 24 FPS


Le nombre de FPS est quand même bien amélioré, et la fonction perform culling est très efficace. Le gros point noir reste ce temps de traitement initial.

Sinon sur cette nouvelle version je n'arrive plus à masquer la géométrie pour n'afficher que le filaire. J'avais rajouté un:

Code : Tout sélectionner

mf[i].GetComponent<MeshRenderer>().enabled=false
dans la boucle for de ta fonction "GetSetMeshes ()", mais désormais le filaire n'apparait que si le mesh est visible...

Re: [C#] GLWireframe

Publié : 22 Fév 2013 12:08
par axel
Je n'avais pas encore tester ton script avec un build, une fois compilé:
- Remove edge sur true, first baking : 50428 ms
- Remove edge sur false, first baking : 39895 ms

Il va falloir que je teste sur toute la scène juste pour voir :)

Re: [C#] GLWireframe

Publié : 22 Fév 2013 12:46
par axel
J'ai voulu faire d'autres tests, et je suis tombé sur un truc bizarre.

J'ai fais une scène avec des cubes et des sphères. Et lorsque j’exécute la scène, je vois le filaire qui ne correspond pas à certains meshes.
En y regardant de plus près je me suis aperçu que cela ne concerne que les cubes que j'ais mis en statiques et qu'ensuite j'ai déplacés, tournés et modifiés l'échelle.
Du coup j'ai placé 8 sphères dans un gameobject, mis le tout en statique, et modifié les transformations, et là j'ai eu ça.
Image

avec ces stats:
first baking : 170765 ms
edges : 121390 !!!

si j’enlève le "statique" des objets, j'obtiens:
first baking : 1277 ms
edges : 11230 (10 fois moins)

Re: [C#] GLWireframe

Publié : 23 Fév 2013 12:06
par artemisart
axel a écrit :Sinon sur cette nouvelle version je n'arrive plus à masquer la géométrie pour n'afficher que le filaire. J'avais rajouté un:

Code : Tout sélectionner

mf[i].GetComponent<MeshRenderer>().enabled=false
dans la boucle for de ta fonction "GetSetMeshes ()", mais désormais le filaire n'apparait que si le mesh est visible...
Oui, vu que le renderer n'est plus visible la fonction Render ne s’exécute plus (si t'enlève le performCulling ça devrait marcher).

Sinon (si c'est possible) tu peux m'envoyer en package la scène où tu as 40-70s de first baking ? (en mp)

Très étrange pour le coup des go statiques, tu as modifié le transform en editor ou ingame ?

Re: [C#] GLWireframe

Publié : 23 Fév 2013 13:11
par artemisart
Update du script :
- Les wires des meshes qui ont bougés ne sont plus bakés s'ils ne sont pas visibles.
- J'ai mis en cache l'array de triangle au lieu d'accéder à chaque fois directement à celui ci... perf du baking x1.5-2 !
- Je stocke les edges en double dans une liste de boolean, pour ne pas les afficher sur les meshes qui bougent -> perf du rendu x2 sur les meshes dynamiques !
- Utilisation de linq pour transformer les vertices en coordonnées globales, aucun changement de perf mais c'est plus propre ^^.

Je mets à jour le premier post dans 2s.

Re: [C#] GLWireframe

Publié : 23 Fév 2013 14:08
par artemisart
Le script et la description sont à jour ;) .

Re: [C#] GLWireframe

Publié : 23 Fév 2013 20:27
par Max
Tiens, cela me faisais penser à un truc cette histoire de Wireframe sur les objets. (bon, je sais, tu va dire que je me réveille à la fumé des cierges ...)

C'est pas aussi perfectionné que ton code, mais en passant par les MeshTopology, on arrive à facilement faire basculer un rendu de mesh en WF,
genre code comme ça: (en 'point' aussi par exemple si on veut, on à même les shadows)

Code : Tout sélectionner

		Mesh mesh;
		
		mesh = GetComponent<MeshFilter>().mesh;		
		for(int id=0; id<mesh.subMeshCount; id++)
		{
			int[] indices = mesh.GetIndices(id);
			mesh.SetIndices (indices, MeshTopology.LineStrip, id);
		}
ça donne ça
Image

A creuser, ça peut être un autre type de piste pour ce genre de tools ;)

Re: [C#] GLWireframe

Publié : 23 Fév 2013 20:33
par artemisart
C'est vrai, j'y ai pensé aussi mais j'aimerais bien garder la compatibilité avec la 3.5 donc...

Un retour sur les perfs du nouveau code sinon ?

Re: [C#] GLWireframe

Publié : 23 Fév 2013 20:34
par Franck
Vous étes des grosses bétes les gars 8-)

Re: [C#] GLWireframe

Publié : 23 Fév 2013 21:20
par Max
Franck a écrit :Vous étes des grosses bétes les gars 8-)
mais non, mais non, juste des bricoleurs un peu illuminés :lol:
artemisart a écrit :C'est vrai, j'y ai pensé aussi mais j'aimerais bien garder la compatibilité avec la 3.5 donc...
arf, la 3.5, pas pensé. ( T'as pensé au render DX11 ?) :mrgreen:
artemisart a écrit :Un retour sur les perfs du nouveau code sinon ?
Oups, j'ai oublié de mettre les valeurs ( x'cuse, occupé au bouche à bouche à mon cochon dinde)
C'est mieux, en tous les cas niveau first baking, puisque je suis passé de 4500 à 1870 ms, donc il n'y a pas photo, ça évolue dans le bon sens
;)