Frame rate trop bas sur android

Toutes les questions sur le développement Mobile, y compris la partie script.
GameTux
Messages : 37
Inscription : 11 Nov 2012 03:13

Frame rate trop bas sur android

Message par GameTux » 02 Mars 2020 06:48

Bonjour,

Alors je suis entrain de faire mon premier jeu, donc bon vous le voyez venir j'ai quelques soucie dans la création de mon jeu.

Le principal soucie c'est que mon jeu rame un peu sur mon téléphone, j'ai un Honor 8 donc c'est pas une bête de course mais quand même.

Sur ma tablette qui est une Samsung galaxy tab A 2019 c'est encore pire.

J'ai mis un script qui permet d'afficher le nombre de fps en jeu, sur mon Honor 8 j'ai entre 50 et 60 fps et sur ma tablette j'ai plutôt 30 - 40 fps.

Le problème surtout c'est que le manque de fps fait trombler la camera, j'ai une camera un peu spécial, elle est "fixer" sur un objet en mouvement mais elle regarde un autre objet en mouvement du coup avec le manque de fps il y a un effet bizarre, mon jeu ne contient pas beaucoup d'objets 3D je suis étonnée qu'il rame comme ça.

Est-ce-que vous avez des conseils pour optimiser le jeu sur Android ?

Est-ce-qu'il y a un moyen dans Unity de savoir qu'est ce qui pompe le plus de ressources ?

Merci

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Frame rate trop bas sur android

Message par djulio74 » 02 Mars 2020 08:03

Salut.
Déjà en premier lieu, sans vouloir dire de bêtises, même avec un framerate trop bas, il ne devrait pas y avoir de raison pour que ta camera tremble, peut importe les conditions que tu lui donne (position, orientation).
quel est le script qui gère ta caméra? utilisation du Time.deltatime?
au pire ton image devrait juste saccader vu le framerate bas, et encore jusque 30fps, c'est a peine visible normalement.

Ensuite comment calcul tu le framerate et comment l'affiche tu? J'ai justement fait hier un script rapide pour me pettre aussi de voir l'impact de modifications sur le framerate dans mon jeu :

Code : Tout sélectionner

using UnityEngine;
public class ShowFPS : MonoBehaviour
{
	private float fps = 0;
	private float smoothfps = 0;
	private float yVelocity = 0.0f;

	void OnGUI()
	{
		fps = 1.0f / Time.smoothDeltaTime;
		smoothfps = Mathf.SmoothDamp(smoothfps, fps, ref yVelocity, 0.3f);
		GUI.Label(new Rect(10, 10, 200, 200), Mathf.RoundToInt(smoothfps).ToString("D4"));
	}
}
pour ce qui est des application mobile, je suis pas bon connaisseur, mais les materials influent pas mal sur les perfs, les light et shadows aussi..
Tu dis ne pas avoir beaucoup d'objets 3d dans ta scène mais ce qui prime c'est le nombre de vertex, combien en ont-il chacun?
Ensuite faudrait voir tes scripts, peut être à optimiser si tu as de lourdes opération en Update ou autre.
pour savoir ce qui bouffe de la ressource, regarde du coté du "profiler",dans unit : windows -> analysis -> profiler.

En gros les solutions peuvent être très variées, donne un peu plus d'info et détails sur ton jeux aidera a cibler le ou les problèmes.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: Frame rate trop bas sur android

Message par DevAmat » 02 Mars 2020 10:16

J'imagine que tu fais des calcules de positions avec ta camera. Si c'est le cas donnes tu bien à ta camera sa nouvelle position dans la fonction "LateUpdate()"?

GameTux
Messages : 37
Inscription : 11 Nov 2012 03:13

Re: Frame rate trop bas sur android

Message par GameTux » 02 Mars 2020 20:34

@djulio74

En effet J'ai des tremblements, mais j'ai l'impression que c'est plutôt l'objet sur le quel est "fixer" la camera qui tremble et non pas tout la camera.

Voilà le code de la camera (que j'ai trouvé sur le net et que j'ai un peu modifier pour avoir le résultat que je veux) :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

//put this component on camera
//drag target object (ball) onto the TargetObject public variable
public class CameraScript : MonoBehaviour
{

    public Transform player;
    public Transform ball;
    // The target we are following
    // The distance in the x-z plane to the target
    public float distance = 10.0f;
    // the height we want the camera to be above the target
    public float height = 5.0f;
    // How much we
    public float heightDamping = 2.0f;
    public float rotationDamping = 3.0f;
    float wantedRotationAngle;
    float wantedHeight;
    float currentRotationAngle;
    float currentHeight;
    Quaternion currentRotation;

    public float distanceBall = 10.0f;
    // the height we want the camera to be above the target
    public float heightBall = 5.0f;
    // Use this for initialization
	
	Vector3 correct;
	
	void Start()
    {

    }
	void Update()
    {	
			
	    float distance = Vector3.Distance(player.transform.position, ball.transform.position);
            float DiffY = player.transform.position.y - ball.transform.position.y;

            wantedRotationAngle = player.eulerAngles.y;
            wantedHeight = player.position.y * 1.1f + heightBall - ball.position.y / distance * Time.deltaTime;
            currentRotationAngle = transform.eulerAngles.y;
            currentHeight = transform.position.y;
            // Damp the rotation around the y-axis
            currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, 0 * Time.deltaTime);
            // Damp the height
            currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);
            // Convert the angle into a rotation
            currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
            // Set the position of the camera on the x-z plane to:
            // distance meters behind the player
            transform.position = player.position;
            transform.position -= currentRotation * Vector3.forward * distanceBall;
            // Set the height of the camera
            transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);
            correct = new Vector3(ball.position.x, ball.position.y + DiffY / 2, ball.position.z);
            transform.LookAt(correct) ;
			
	}
}
Et oui comme tu peux le voir il y a du "Time.deltatime" mais je dois avouer que je ne comprend pas vraiment quel et son utilité.

Pour le compteur de FPS j'utilise ce code (Que j'ai trouvé sur le net aussi) :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class FPS : MonoBehaviour
{
	float deltaTime = 0.0f;

	void Update()
	{
		deltaTime += (Time.unscaledDeltaTime - deltaTime) * 0.1f;
	}

	void OnGUI()
	{
		int w = Screen.width, h = Screen.height;

		GUIStyle style = new GUIStyle();

		Rect rect = new Rect(0, 0, w, h * 2 / 100);
		style.alignment = TextAnchor.UpperLeft;
		style.fontSize = h * 2 / 100;
		style.normal.textColor = new Color(0.0f, 0.0f, 0.5f, 1.0f);
		float msec = deltaTime * 1000.0f;
		float fps = 1.0f / deltaTime;
		string text = string.Format("{0:0.0} ms ({1:0.} fps)", msec, fps);
		GUI.Label(rect, text, style);
	}
}


Pour ce qui est des materials j'utilise seulement des materials "Standard" à l'exception d'un objet ou j'utilise "Unlit -> Transparent" pour avoir de la transparence.

Et le nombre de vertex est bas, c'est des objets que j'ai faits moi même, dans unity quand je regarde dans le bouton "Stats" en haut à droite quand on lance le jeu j'ai "Verts : 103.0 k" je suis même pas sûr que ce soit bien le nombre de Vertex ?

Sinon j'ai aussi un terrain sur le quel il y a des arbres mais j'ai mis tous les réglages au minimum dans les options du terrain, d'ailleurs a la base je voulais aussi mettre de l'herbe mais après plusieurs tentatives cela me semble impossible pour un jeu mobile, l'herbe fait ramer le jeu fortement.

Pour "profiler",dans unit : windows -> analysis -> profiler j'avais déjà essayé de regarder dedans mais bizarrement ce qui prend le plus de CPU c'est "Vsync" et "Other", j'ai peut-être pas bien compris comment ça fonctionne mais je vois rien de particulier.

@DevAmat Oui comme tu peux le voir en haut il y a des calculs, j'ai essayé de mettre le scripte entier dans "LateUpdate()" mais c'est pareille, j'ai aussi essayé de mettre seulement le dernier paramètre, donc "transform.LookAt(correct) ;" dans "LateUpdate()" mais pareille sa tremble toujours.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Frame rate trop bas sur android

Message par boubouk50 » 03 Mars 2020 09:13

C'est un problème récurrent, je le crains. Il provient surtout de l'attachement de la caméra au parent.
Entre l'objet en mouvement (géré avec la physique? -> FixedUpdate ou Update), l'objet regardé (FixedUpdate ou Update) et le rendu caméra (LateUpdate), cela fait beaucoup de timing différents.
Quoiqu'il en soit, travailler avec la caméra se fait dans le LateUpdate ().
https://forum.unity.com/threads/first-p ... nt.533892/
https://forum.unity.com/threads/camera- ... em.115224/
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

GameTux
Messages : 37
Inscription : 11 Nov 2012 03:13

Re: Frame rate trop bas sur android

Message par GameTux » 04 Mars 2020 23:17

Ok, alors pour le moment j'ai fait quelque chose qui "contourne le problème" j'ai simplement bloquer le frame rate à 30 FPS et du coup je peux même ajouter de l'herbe j'ai plus de problèmes, ni de tremblement ni de chute de FPS.

Répondre

Revenir vers « Développement plateformes mobile Iphone et Android »