Emetteur de particules : optimisation de code

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: Emetteur de particules : optimisation de code

Message par Alesk » 11 Mars 2014 20:24

Ouep, j'avais déjà lu tout ça, merci pour la confirmation.
Mais du coup ce que je n'ai pas trouvé ce sont des précisions sur ce qui peut être considéré comme de "petits" objets...
Mon struct actuel ressemble à ça :

Code : Tout sélectionner

public struct Puffy_Particle{
	public Vector3 position;
	public Vector3 direction;
	public float randomSeed;
	public float startLifetime;
	public float lifetime;
	public Color startColor;
	public Color color;
	public Color endColor;
	public float startSize;
	public float size;
	public float endSize;
	public float alphaMultiplier;
	public float ageRatio;
	public float speed;
	public bool useEmitterGradient;
	public bool justEmitted;
	public bool dead;

	public Puffy_Particle(Vector3 pos){
		this.position = pos;
		this.direction = Vector3.up;
		this.randomSeed = 0;
		this.startLifetime = 0f;
		this.lifetime = 0f;
		this.startColor = Color.white;
		this.color = Color.white;
		this.endColor = Color.white;
		this.startSize = 0f;
		this.size = 0f;
		this.endSize = 1;
		this.alphaMultiplier = 1f;
		this.ageRatio = 0f;
		this.speed = 0f;
		this.useEmitterGradient = false;
		this.justEmitted = true;
		this.dead = true;
	}
}
est-ce assez petit pour que ça reste intéressant de rester sur un struct ?

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Emetteur de particules : optimisation de code

Message par artemisart » 12 Mars 2014 00:00

Effectivement :mrgreen: ça me parait gros, après t'as pas vraiment le choix je pense ^^ (la msdn recommande pas plus de 20 bytes si je me goure pas).
Pour la vitesse (mais ça concerne pas vraiment les struct/class) tu peux aussi regarder Mono SIMD pour booster les calculs vectoriels par ex : http://docs.go-mono.com/?link=N%3aMono.Simd, http://pastebin.com/XeKtVJ5g, http://forum.unity3d.com/threads/158652 ... ost1417588

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Emetteur de particules : optimisation de code

Message par Alesk » 15 Mars 2014 20:40

re !

Bon, visiblement dans mon cas, que j'utilise des structs ou des class, ça change rien... donc je garde les class

Je passe maintenant à un nouveau défi : améliorer le rendu des particules quand elles sont affichées sous la forme de nuages (donc amassées à un endroit donné)
Il faut que je parvienne à détecter la densité locale de particules ainsi que celles qui en masquent d'autres, afin de définir l'assombrissement de chaque particule en fonction de celles qui l'entourent et de celles qui lui cachent éventuellement la source de lumière principale... sans que ça ne ruine les perfs :roll:

Pour le moment je pense m'attaquer à un octree pour diviser l'espace et optimiser la détection des particules proches les unes des autres, mais si vous avez des suggestions sur une approche à suivre... je suis preneur ;)

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Emetteur de particules : optimisation de code

Message par Alesk » 21 Mars 2014 10:52

Yo

Bon j'avance un peu mais ça s'avère pas mal compliqué de maintenir les perfs :roll:

Je pensais faire un octree, mais le souci c'est que les particules peuvent être étalées sur de longues distances et qu'il n'y a pas forcément moyen de connaitre l'étendue de toute ça.
J'ai donc opté pour une autre approche, à base de voxels, qui me semble moins "propre", mais plus souple :
(à noter que je peux éventuellement faire des "gros" voxels qui seront chacun un octree, afin d'affiner tout ça)

Pour le moment j'ai créé un dictionnary avec pour clé la position des voxels, et pour contenu la liste des particules qui se trouvent dans chaque voxel.
Lorsqu'une particule se déplace, dès qu'elle a parcourue une distance supérieure à la taille d'un voxel, je la fais passer dans le nouveau voxel où elle peut éventuellement se trouver.
Ce test n'est effectué qu'une fois toutes les N frames (chiffre que je dois encore définir précisément, ou à calculer en fonction du total de particules, pour le moment c'est 25) , pour éviter que les perfs ne s'effondrent quand il y a beaucoup de particules.

Mon premier souci coté performances, c'est que je n'ai pas trouvé de méthode pour rendre multi-threads le processus de mise à jour de ces voxels : les Dictionnary et les List ne sont pas thread safe, et donc je ne peux pas m'amuser à ajouter ou supprimer des éléments dans ces deux types de variables à partir de plusieurs threads en simultané... :/

Et comme mon cerveau commence à tourner en ronds, je ne serais pas contre quelques avis extérieurs éclairés :mrgreen:

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Emetteur de particules : optimisation de code

Message par Alesk » 16 Oct 2014 13:30

Hey !

Pour le moment les histoires de voxels sont en stand-by, par contre, j'ai progressé sur les nuages ;)

(souris pour pivoter, flèches pour se déplacer)
http://www.alesk.fr/PuffySmoke/clouds.html

Votre avis ?

Avatar de l’utilisateur
axel
Messages : 1924
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: Emetteur de particules : optimisation de code

Message par axel » 20 Oct 2014 11:03

pas mal, ça peut le faire. :P

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Emetteur de particules : optimisation de code

Message par ZJP » 20 Oct 2014 16:31

Ah oui, bien. 8-)

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Cherche désespérément testeur ios et android

Message par Alesk » 04 Déc 2014 13:29

Bonjour tout le monde,

ça fait un moment que ça traine, mais je ne suis plus très loin de sortir une mise à jour pour PuffySmoke...
Cependant, avant ça, j'aurais besoin que l'on me confirme que ça tourne toujours sur iOS et Android, y aurait-il svp quelqu'un susceptible de m'aider dans l'assistance ? (la manoeuvre se limitant à compiler le projet puis à le lancer sur le périphérique)

Merci :mrgreen:

Répondre

Revenir vers « Scripting »