optimisation, Frustum Culling ?
optimisation, Frustum Culling ?
Bonjour !
Bon décidément j'ai souvent besoin de vous haha, mais c'est peut être ma dernière question
Je suis actuellement sur un projet ou le terrain est en forme de cube ( comme minecraft ) mais en 2D vu à la Mario !
Chaque bloques sont en préfab que j'ai dupliqué à souhait pour former le terrain ( peut être pas la bonne façon de faire ? )
Le problème est que .... ça ram ! mais uniquement si je suis immobile, quand je déplace mon personnage le jeu est fluide .... je ne comprend pas du tout pourquoi !
Donc j'ai cherché pour faire disparaitre les cubes hors de la caméra et je suis tombé sur l'occlusion culling ... mais qui malheureusement fonctionne que sur du 3d. Puis j'ai vu le Frustum Culling qui est apparemment déjà activé dans unity.
Mais moi j'ai aucun élément qui disparait hors de la caméra ...
Auriez vous des explications ou des idées à me donner svp ?
merci de votre aide!
Bon décidément j'ai souvent besoin de vous haha, mais c'est peut être ma dernière question
Je suis actuellement sur un projet ou le terrain est en forme de cube ( comme minecraft ) mais en 2D vu à la Mario !
Chaque bloques sont en préfab que j'ai dupliqué à souhait pour former le terrain ( peut être pas la bonne façon de faire ? )
Le problème est que .... ça ram ! mais uniquement si je suis immobile, quand je déplace mon personnage le jeu est fluide .... je ne comprend pas du tout pourquoi !
Donc j'ai cherché pour faire disparaitre les cubes hors de la caméra et je suis tombé sur l'occlusion culling ... mais qui malheureusement fonctionne que sur du 3d. Puis j'ai vu le Frustum Culling qui est apparemment déjà activé dans unity.
Mais moi j'ai aucun élément qui disparait hors de la caméra ...
Auriez vous des explications ou des idées à me donner svp ?
merci de votre aide!
Dernière édition par Riblito le 28 Juil 2022 21:56, édité 2 fois.
Re: optimisation, Frustum Culling ?
Bonjour,
si tu es immobile, comment t'aperçois-tu que ça rame ? Combien de FPS quand le joueur bouge et quand il est immobile ?
Les cubes sont des cubes Unity de base, ou ils ont des composants supplémentaires ?
Combien de cubes visibles dans la scène ? On peut avoir une copie d'écran ?
si tu es immobile, comment t'aperçois-tu que ça rame ? Combien de FPS quand le joueur bouge et quand il est immobile ?
Les cubes sont des cubes Unity de base, ou ils ont des composants supplémentaires ?
Combien de cubes visibles dans la scène ? On peut avoir une copie d'écran ?
Re: optimisation, Frustum Culling ?
Et bien je m'en suis rendu compte à cause de la pluie que j'ai ajouté, quand je me déplace elle est fluide, à l'arrêt c'est soirée photos chez mamie.
J'ai rajouté quelques ligne de bloc et le jeu est figé complétement ....
j'ai réalisé les cubes comme ça :
j'ai ajouté le sprite du cube dans la scene
j'ai rajouté son collider
j'ai ajouté son flowmachine/script
et j'ai transformé le cube en préfab que je duplique.....
j'ai environ 500 cubes .... mais j'ai prévu de faire bien plus profond que ça, du coup c'est problématique
voici une capture avec un cube de sélectionné pour te rendre compte
J'ai rajouté quelques ligne de bloc et le jeu est figé complétement ....
j'ai réalisé les cubes comme ça :
j'ai ajouté le sprite du cube dans la scene
j'ai rajouté son collider
j'ai ajouté son flowmachine/script
et j'ai transformé le cube en préfab que je duplique.....
j'ai environ 500 cubes .... mais j'ai prévu de faire bien plus profond que ça, du coup c'est problématique
voici une capture avec un cube de sélectionné pour te rendre compte
Re: optimisation, Frustum Culling ?
Merci,
Merci de désactiver la pluie, et de mesurer les FPS (fenêtre Game, section Stats) et de donner les résultats sans la pluie :
- à l'arrêt
- en mouvement
Et pourquoi la pluie ne serait-elle pas la cause de tes tourments ?Et bien je m'en suis rendu compte à cause de la pluie que j'ai ajouté, quand je me déplace elle est fluide, à l'arrêt c'est soirée photos chez mamie.
J'ai rajouté quelques ligne de bloc et le jeu est figé complétement ....
Merci de désactiver la pluie, et de mesurer les FPS (fenêtre Game, section Stats) et de donner les résultats sans la pluie :
- à l'arrêt
- en mouvement
Re: optimisation, Frustum Culling ?
je viens de faire les tests !
Avec pluie :
en mouvement : 14 FPS
Sans bouger : 7 FPS
Sans pluie :
en mouvement : 15 FPS
Sans bouger : 8 FPS
j'ai gagné vraiment très peu de fps ...
c'est peut être à cause du nombre de script dupliqué ? vu que chaque bloc à du script ? ( j'espère pas ^^' )
et je comprend juste pas pourquoi les fps chutent quand je suis immobile ... ça n'a pas de sens, si ?
edit : c'est vraiment les bloc, j'ai presque tout retiré et je suis à 45FPS
Edit 2 : j'ai retiré les flow/script des blocs et je roule sur les fps .... donc, j'ai regardé et j'ai vu que mon system de regain de HP des blocs avec le temps me fait gagner 20 fps quand je retire la fonction.
Par contre, c'est vraiment pas possible de faire disparaitre quand c'est hors de vu ? car quand je vais augmenter la profondeur et le nombre de bloc ça va être impossible
Avec pluie :
en mouvement : 14 FPS
Sans bouger : 7 FPS
Sans pluie :
en mouvement : 15 FPS
Sans bouger : 8 FPS
j'ai gagné vraiment très peu de fps ...
c'est peut être à cause du nombre de script dupliqué ? vu que chaque bloc à du script ? ( j'espère pas ^^' )
et je comprend juste pas pourquoi les fps chutent quand je suis immobile ... ça n'a pas de sens, si ?
edit : c'est vraiment les bloc, j'ai presque tout retiré et je suis à 45FPS
Edit 2 : j'ai retiré les flow/script des blocs et je roule sur les fps .... donc, j'ai regardé et j'ai vu que mon system de regain de HP des blocs avec le temps me fait gagner 20 fps quand je retire la fonction.
Par contre, c'est vraiment pas possible de faire disparaitre quand c'est hors de vu ? car quand je vais augmenter la profondeur et le nombre de bloc ça va être impossible
Re: optimisation, Frustum Culling ?
Re,
effectivement, ça ne fait pas lourd... C'est sur que 500 prefabs avec script, ça démarre mal...
Je ne sais pas ce que tu veux faire, donc je vais peut-être te proposer des pistes inadéquates, mais je vois des choses possibles :
1) tu n'actives les scripts que sur la couche du dessus. A priori, les couches situées 2 niveaux sous le joueur n'ont pas de raison de se régénérer, non ? Quand un sprite disparaît, dans sa méthode OnDestroy il active le sprite situé sous lui.
2) tu abandonnes la régénération. Si des scripts de sprites doivent être présents pour une autre raison, tu peux peut-être n'activer que ceux des sprites situés à une certaine distance du joueur (dans minecraft, seuls les chunks proches du joueur sont actifs).
3) Tu fais un manager de sprites : c'est lui qui fait tourner l'update pour les sprites. Par exemple il tient à jour la liste des sprites qui sont en cours de régénération : à chaque frame, il augmente leur HP, s'ils ont atteint leur HP max, il les sort de la liste.
effectivement, ça ne fait pas lourd... C'est sur que 500 prefabs avec script, ça démarre mal...
Je ne sais pas ce que tu veux faire, donc je vais peut-être te proposer des pistes inadéquates, mais je vois des choses possibles :
1) tu n'actives les scripts que sur la couche du dessus. A priori, les couches situées 2 niveaux sous le joueur n'ont pas de raison de se régénérer, non ? Quand un sprite disparaît, dans sa méthode OnDestroy il active le sprite situé sous lui.
2) tu abandonnes la régénération. Si des scripts de sprites doivent être présents pour une autre raison, tu peux peut-être n'activer que ceux des sprites situés à une certaine distance du joueur (dans minecraft, seuls les chunks proches du joueur sont actifs).
3) Tu fais un manager de sprites : c'est lui qui fait tourner l'update pour les sprites. Par exemple il tient à jour la liste des sprites qui sont en cours de régénération : à chaque frame, il augmente leur HP, s'ils ont atteint leur HP max, il les sort de la liste.
Non, mais sans examiner ton code, pas facile de t'aider. Et si j'ai bien compris, tu fais ton projet avec Bolt ou équivalent ? Je ne connais pas Bolt suffisamment pour t'aider.et je comprend juste pas pourquoi les fps chutent quand je suis immobile ... ça n'a pas de sens, si ?
Re: optimisation, Frustum Culling ?
Merci pour ta réponse !
Par contre pour la distance, penses tu qu'il faudrait mettre le script ( celui qui dit quand le joueur est proche = tu t'affiches ) sur les blocs en question ou sur le player ? sur le player je pense ...
C'est possible ça ? de lui dire tu actives le script de l'objet en dessous ? j'en apprends tous les joursdans sa méthode OnDestroy il active le sprite situé sous lui.
J'ai retiré le system de régénération, j'ai vu au plus simple ... et puis c'est plus réaliste.2) tu abandonnes la régénération. Si des scripts de sprites doivent être présents pour une autre raison, tu peux peut-être n'activer que ceux des sprites situés à une certaine distance du joueur (dans minecraft, seuls les chunks proches du joueur sont actifs).
Par contre pour la distance, penses tu qu'il faudrait mettre le script ( celui qui dit quand le joueur est proche = tu t'affiches ) sur les blocs en question ou sur le player ? sur le player je pense ...
Re: optimisation, Frustum Culling ?
Le player est une possibilité, mais le plus logique est un gameobject empty.
Re: optimisation, Frustum Culling ?
merci pour ton aide !
Je vais travailler sur cela, je reviendrais si besoin
Je vais travailler sur cela, je reviendrais si besoin
Re: optimisation, Frustum Culling ?
Bon je reviens vers vous car j'ai une dernière question
J'ai réussi le script pour faire en sorte que si tu es trop loin alors l'objet passe en inactif et si trop proche en actif.... script que j'ai mis dans un empty ( et j'ai mis les bloc dedans pour pouvoir les désactiver / réactiver )
Il y a qu'une chose que je comprends pas, c'est comment faire en sorte que ça prenne en compte tout les bloc ? car j'ai essayé en indiquant les object avec le taf "bloc" ou alors avec une variable avec le nom de l'objet dedans, mais ça fonctionne que sur un bloc ...
il faut faire une sorte de boucle qui tournerait sur tout les bloc du jeu ?
J'ai réussi le script pour faire en sorte que si tu es trop loin alors l'objet passe en inactif et si trop proche en actif.... script que j'ai mis dans un empty ( et j'ai mis les bloc dedans pour pouvoir les désactiver / réactiver )
Il y a qu'une chose que je comprends pas, c'est comment faire en sorte que ça prenne en compte tout les bloc ? car j'ai essayé en indiquant les object avec le taf "bloc" ou alors avec une variable avec le nom de l'objet dedans, mais ça fonctionne que sur un bloc ...
il faut faire une sorte de boucle qui tournerait sur tout les bloc du jeu ?