Optimiser Draw calls personnage

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
KyDenZ
Messages : 7
Inscription : 10 Mars 2014 22:04

Optimiser Draw calls personnage

Message par KyDenZ » 26 Juin 2014 17:37

Bonjour,

Je sais qu'il existe des scripts pour optimiser le nombre de draw calls dans une scène d'Unity, mais le problème c'est que je n'arrive pas à réduire le nombre de draw calls sur mon personnage.

Mon personnage est exporté de 3Ds max avec 20 bones ( pour avoir un personnage correctement articulé ) et il est en 3 objets, il fait 1800 poly / 3300 tris

Ma scène tourne avec :
55 fps sur smartphones / 25 draw calls
4.5 polys
Textures : 12 - 0.4Mb
VRAM : 10.5 Mnb to 20.6Mb ( of Unknown )
VBO Total : 37 - 9.6 Mb
Visible Skinned Meshes : 12
Animation 1

Donc d'accord mon jeu tourne pas loin des 60 images par secondes, mais le problème c'est qu'au bout d'une dizaine de partie on se retrouve avec 25 images par secondes, des lags.. Donc je voudrais vraiment réduire le nombre de draw calls sur le personnage, car ça devient injouable ! Et le téléphone chauffe pas mal..

Je test mon jeu sur Windows Phone et Android avec 2 cores à 1.5Ghz et 1Go de RAM

PS : si il y a des développeurs expérimenter pour m'aider à connecter mon jeu à Facebook ( récupérer les amis qui jouent à ce jeu ) et faire des achats intégré sous Windows Phone, je suis intéressé.

Sinon le jeu est terminé.

Merci d'avance

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

Re: Optimiser Draw calls personnage

Message par ZJP » 26 Juin 2014 19:20

KyDenZ a écrit :Bonjour,

Je sais qu'il existe des scripts pour optimiser le nombre de draw calls dans une scène d'Unity, mais le problème c'est que je n'arrive pas à réduire le nombre de draw calls sur mon personnage.

Mon personnage est exporté de 3Ds max avec 20 bones ( pour avoir un personnage correctement articulé ) et il est en 3 objets, il fait 1800 poly / 3300 tris

Ma scène tourne avec :
55 fps sur smartphones / 25 draw calls
4.5 polys
Textures : 12 - 0.4Mb
VRAM : 10.5 Mnb to 20.6Mb ( of Unknown )
VBO Total : 37 - 9.6 Mb
Visible Skinned Meshes : 12
Animation 1

Donc d'accord mon jeu tourne pas loin des 60 images par secondes, mais le problème c'est qu'au bout d'une dizaine de partie on se retrouve avec 25 images par secondes, des lags.. Donc je voudrais vraiment réduire le nombre de draw calls sur le personnage, car ça devient injouable ! Et le téléphone chauffe pas mal..

Je test mon jeu sur Windows Phone et Android avec 2 cores à 1.5Ghz et 1Go de RAM

PS : si il y a des développeurs expérimenter pour m'aider à connecter mon jeu à Facebook ( récupérer les amis qui jouent à ce jeu ) et faire des achats intégré sous Windows Phone, je suis intéressé.

Sinon le jeu est terminé. !!! :shock:

Merci d'avance

KyDenZ
Messages : 7
Inscription : 10 Mars 2014 22:04

Re: Optimiser Draw calls personnage

Message par KyDenZ » 26 Juin 2014 23:49

Bon d'accord il y a encore du travail.. :D
Mais le plus gros est terminé, la partie graphique, les scripts, le parcours, le tableaux des records, la boutique, les succès..

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Optimiser Draw calls personnage

Message par F@B » 27 Juin 2014 09:28

rien de tout ça n'est terminé si tu as des problemes de perfs!

donc c'est surement ta façon de coder, c'est ce que sous entend ZJP, on pourra pas t'aider sans en savoir plus.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

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

Re: Optimiser Draw calls personnage

Message par axel » 27 Juin 2014 10:45

Il est vrai que si c'est fluide au début et que ça lag au bout d'un certain nombre de parties, c'est que le problème ne vient surement pas du mesh mais de ton code quelque part...

zugsoft
Messages : 386
Inscription : 26 Juin 2014 23:43
Localisation : Swiss
Contact :

Re: Optimiser Draw calls personnage

Message par zugsoft » 27 Juin 2014 15:45

Je dirai la meme chose, probleme de code.
J'ai entre 100 et 200 draws call et ca reste toujours fluide apres 1h de jeu sur Windows Phone.
Tu dois avoir du garbage ou du overhead qui consomme un max.

il ne faut pas creer un nouvel objet dans tes Update(ex componentObject), mais les declarer dans ta Class et les instancier une seule fois dans ton Start ou Update si Null.

J'ai gagné 25% en perf en faisant ca, et diminué les overhead.
Moon RTS

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

Re: Optimiser Draw calls personnage

Message par ZJP » 27 Juin 2014 21:56

Le GC créera une perte provisoire de FPS lors de pics, mais si cela est constant c'est évidement pas normal. Un "memory leak"?!
D’où ma remarque. A ce stade, c'est plus du "prototypage" qu'un code prêts a être diffusé. Cela dit, il suffit d'une seule c... dans un script. :mrgreen:

KyDenZ
Messages : 7
Inscription : 10 Mars 2014 22:04

Re: Optimiser Draw calls personnage

Message par KyDenZ » 27 Juin 2014 23:38

Je pensais pas que le code pouvais ralentir le jeu à ce point.

Je vais essayer de l'optimiser alors.

Voici le code principale du jeu :

Code : Tout sélectionner

//Public variables
public var GameOver : boolean;
public var GameOver2 : boolean;
public var touch : boolean;
public var rejoue : boolean;
var speed : float;
var speed2 : float;
var speed3 : float;
var gravity : float;
var saut: float;
var other : Transform;
var distance : float;
var distance2 : float;
var scriptB : pause; // Déclaration de la variable
var pos : Vector2 = new Vector2(20,40);
var size : Vector2 = new Vector2(60,20);
var sol : boolean;
var securite : int = 0;
var securite2 : int = 0;
var sauv_z : int = 0;
var sauv_z2 : int = 0;
var sauv_y : int = 0;
var sauv_y2 : int = 0; 
var replacement2 : boolean ;
var diffchute : float = 0;
var diffchute2 : boolean ;
var chute : float = 0;

//Private variables
private var controller:CharacterController;
private var moveDirection:Vector3;
private var deltaTime:float;

function Start () 
{
	controller = GetComponent('CharacterController');
	GameOver = false;
	rejoue = true;
	scriptB = GameObject.Find("other").GetComponent(pause); // Cherche l'objet nommé patate3 et récupère le script
	diffchute2 = false;
}
 
function OnTriggerStay (others:Collider)
{
	touch = true;
}

function Update () 
{

	// Cadence du Temps
	deltaTime = Time.deltaTime;
	
	// Enregistrement de la distance
	distance2 = distance ;
	
	// Augmentation de la vitesse
	if ( GameOver == false)
	{
		speed = speed + speed2 - speed3;
		speed3 = speed2;
		speed2 = distance / 1500;
	}

	
	// Si le perso touche le sol
	if(controller.isGrounded )
	{
		// touche le sol
		sol = true;
		
		// Distance dans le jeu
		distance = Vector3.Distance(other.position, transform.position);
	
		// Déplacement Droite/Gauche
		moveDirection = Vector3(0, 0, 2 * speed);

		// Animation courir
		if ( distance2 != distance )
		{
		animation.CrossFade("run",0.2);
		}
		
		// Si on clic on saute
		if(Input.GetMouseButtonDown(0))
		{
			moveDirection.y = saut;
			animation.CrossFade("jump",0.2);
		}
		
	}
	// Si on touche pas le sol
	else
	{
		// touche pas le sol
		sol = false;
		
		// Animation saut
		animation.CrossFade("jump",0.2);
		
		// Distance dans le jeu
		distance = Vector3.Distance(other.position, transform.position);
	}
	
	// Gravité
	moveDirection.y -= gravity * deltaTime;
		
	// Comparaison de la distance
	if ( distance2 == distance)
	{
		animation.CrossFade("repos",0.2);
	}	
		
	// Déplacement du Personnage
	controller.Move(moveDirection*deltaTime);

	
	if (transform.position.y < -4)
	{
		touch = true;
	}
	
	if ( touch == true )
	{
		GameOver = true;
	}
	else
	{
		GameOver = false;
	}
	
	replacement2 = scriptB.replacement;

	if (replacement2 == true && touch == true && rejoue == true)
	{
		transform.position.y = sauv_y;
		transform.position.z = sauv_z;
		rejoue = false;
	}
	
	
	// Test de chute
	diffchute = chute - transform.position.y;
	diffchute = Mathf.Round(diffchute*1000)/1000;

	if ( diffchute > 0.05 || diffchute < (-0.05))
	{
		diffchute2 = true;
	}
	else
	{
		diffchute2 = false;
	}
	
	if ( sol == true && touch == false && diffchute2 == false)
	{
		securite = securite + 1;
		if ( securite > 1 )
		{
			if ( securite2 < 2 ) // 2 boucles avant de sauvegarder la position
			{
				sauv_z2 = transform.position.z;
				sauv_y2 = transform.position.y;
			}
			securite2 = securite2 + 1;
			if ( securite2 > 30) // 30 boucles après avoir sauvegarder la position
			{
				sauv_z = sauv_z2;
				sauv_y = sauv_y2;
				securite = 0;
				securite2 = 0;
				print("Position de sécurité enregistrée");
			}
		}
	}
	else
	{
		securite = 0;
		securite2 = 0;
	}
	
	chute = transform.position.y;
	
	touch = false;
	
	
	
}




zugsoft
Messages : 386
Inscription : 26 Juin 2014 23:43
Localisation : Swiss
Contact :

Re: Optimiser Draw calls personnage

Message par zugsoft » 28 Juin 2014 08:45

En effet si ton code c'est uniquement un script, ton probleme ne vient pas de la.
Moon RTS

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

Re: Optimiser Draw calls personnage

Message par Alesk » 28 Juin 2014 09:18

à premier vue, je ne trouve pas d'élément qui explique tes ralentissements dans le code que tu as posté... en as-tu d'autres ?

Répondre

Revenir vers « Unity le logiciel »