Faire de grand niveaux avec un minimum de lags [Résolu]

Bonjours, je fait un jeu de plateforme, mais la taille du niveau commence à être trop gourmande en ram, soit quand j’élimine tous les ennemis le jeu revient à en rythme normal mais dès qu’il y a apparition des ennemis le jeu lag, j’ai pensé à faire apparaître les ennemis au fur et à mesure ( quand j’ai commencé la création ), mais cela ne suffit pas, je compte donc faire un décors qui se créé dynamiquement, je pose la question : comment je fait ?

J’ai penser que comme les ennemis : supprimer ce qui est trop à l’arrière et créer des plateforme devant mais ça va faire beaucoup d’action puisque j’utilise des titles de 16*16.
J’ai aussi penser faire une sauvegarde de positions de tout ce qui doit être créé mais le fichier je le créer comment sans éditeur et sans compiler le jeu ? je doit tout faire à la main ?

fait voir ton jeu colin :slight_smile:

Pourquoi ? :confused:
t’as une idée au moins : je divulgue pas les sources comme ça, la personne pour qui je fais le projet ne veut pas que le jeu sois publié avant son mariage donc je le montre juste aux personnes qui ont une vraie idée à mon problème :wink:

Colin,

Ton problème m’intéresse. J’utilise moi aussi un grand nombre d’objets dans mon projet actuel. Heureusement, peu sont en mouvement en même temps, donc je ne constate pas encore de perte de performance. Mais, comme toi, je me pose des questions sur les limites de Game Develop.

Mais de toutes les manières, tu n’es pas assez précis dans la description de ton problème. Renseigne-nous : quelle est la taille de ton niveau (grand comment) ? Combien d’objets au total doit comporter la scène de ton niveau ? Et quels types d’objets (combien d‘ennemis, combien d’éléments de décor, combien de plateformes) ? Combien sont animés en même temps, combien sont immobiles ?

Il est certain que, si Game Develop doit tester simultanément les conditions de mouvement de beaucoup d’objets à la fois, il arrive à saturation au bout d’un moment. C’est un problème qui m’inquiète autant que toi, même si je n’y suis pas encore confronté. As-tu testé de ce que cela donne, si aucun objet n’est en mouvement, à part le personnage-héros de ton jeu…

Bien si il y a que le héro ainsi que quelques plateformes mobiles ça va impeccable mais dès qu’il y a 5 ou 6 ennemis ( je n’en fait pas apparaître plus d’un coup ) ça lag pas mal :frowning:

Faisons dans les précisions :smiley: :

donc environs 6 objets animés maximum.
Il y a 2991 Objets
Il y en a maximum 7 en mouvement d’un coup
Il y a maximum 3 objets qui sont soumis à la loi de la gravité
le terrain fait de gauche à droite 3572 pixels mais tout n’est pas comblé par des objets.

Est-ce assez précis ? sinon dites-moi ce qui doit être ajouter à la liste :slight_smile:

On a parlé avec Donut_prod de ces histoires de performance, mais je ne retrouve pas de sujet probants.

Souvent le goulot d’étranglement des performances provient de conditions réalisées sur un grand nombre d’objets.

Imaginons que je teste la collision entre 10 Personnages et 50 Décors en faisant cette condition :
Personnage est en collision avec Décors
Cette condition implique de tester la collision 10*50 = 500 fois.

Que faire alors ? Une des premières solutions est de s’assurer d’utiliser des conditions comme celle de collision le moins possible. Plutôt que de faire :
Personnage est en collision avec Décors
La variable Chute de Personnage est = à 1

Faites :
La variable Chute de Personnage est = à 1
Personnage est en collision avec Décors

( La première condition testera par exemple les 10 objets personnage, et si elle n’en retient que 2, il n’y aura plus que 2*50 = 100 test de collision à faire )

Dans le même état d’esprit, éviter de répéter les conditions comme ceci :
Condition : La variable Chute de Personnage est = à 1
Action : Faire ceci
Condition : La variable Chute de Personnage est = à 1 et La variable Vie de Personnage est = à 0
Action : Faire cela

En les regroupant par exemple en sous évènements :
Condition : La variable Chute de Personnage est = à 1
Action : Faire ceci
Sous évènement : Condition : La variable Vie de Personnage est = à 0
--------------------Action : Faire cela

Au niveau des actions, autant éviter de même de répéter des actions si possible. Plutôt que de faire :
Condition : Pas de conditions
Action : Mettre la couleur globale de MonObjet à 128;50;128

faites :
Condition : Au lancement de la scène ( ou alors juste après la création de l’objet )
Action : Mettre la couleur globale de MonObjet à 128;50;128

Les forces peuvent s’avérer gourmandes, surtout quand la dissipation n’est pas égale à 0, car elles sont à l’instar des conditions modifiées à chaque tour de boucle pour chaque objet qui la possède.
Dernière solution, réduire le nombre d’objets. Cela peut être par exemple rassembler plusieurs décors en un seul, ou supprimer des objets qui servent à faire des effets de particule par exemple.

3000 objets, c’est quand même assez conséquent. J’ai cru comprendre qu’ils ne bougeaient pas, les problèmes viendraient plutôt des conditions apparemment.
A titre d’exemple, dans mon jeu Eternity Under Fire, qui commence à ramer assez vite quand il y a beaucoup de particules de sang, j’ai pu corriger le problème en faisant ceci : Une fois que le sang est tombé par terre, plutôt que de l’arrêter et de le laisser, je le détruit et créé un objet “Sang statique” à la place. Vu qu’il n’y a aucune conditions ni actions en relation avec cet objet, ( alors que pour le sang normal, il y a des tests pour vérifier sa hauteur ), les performance sont énormément améliorée : Il peut y avoir beaucoup de sang par terre, ça ne changera pas grand chose : Seul le sang en l’air est couteux pour les performances, et il n’y en a jamais trop.

Ok, merci je vais regarder ça, mais je n’ai pas encore de particules et mes évènements sont structurés comme tu l’as dit à l’exception que je n’ai pas mis de variable pour tester la chute, et j’ai oublier de préciser que l’objet à héro à 3 capteurs collés à lui et les deux objets ennemis soumis à la gravité n’en ont qu’un ça mange beaucoup de performance ? :confused:

J’ai relus le tout, il me semble que je peut en effet faire beaucoup mieux au niveau des évènements, mais après mon PC est un peu vieux. Sinon la solution serai peut-être de faire des changements de scène discrets ( avec sauvegarde de tous les Etats ) qui permettrai alors de faire des niveaux d’une taille plus ou moins infini. (enfin cela ne s’applique pas à certains jeux pour lesquels ça serai mal foutu de faire ça )

EDIT : bien j’ai supprimé des objets en trop ( comme les capteurs “Murs” et j’ai retiré certains objets comme la terre qui n’ont pas lieu de tester une collision avec le joueur car elle se trouve sous l’herbe et j’ai déjà un gain de puissance conséquent :slight_smile:
( Surtout la terre, c’est ça qui faisait tout lager puisque j’en ai mis un nombre énorme :laughing:, j’ai trouvé une bonne solution à mon problème surtout que mes évènement sont bel et bien structurés de façon correct )

Autre technique, utilisée dans les vieux jeux-vidéos, ne faire des tests genre collision et autres que dans l’écran que voit le joueur.
Par exemple un ennemi qui tomber toujours (plateforme) n’est pas activé quand il n’est pas dans la caméra du joueur. Ça permet de diminuer énormément de tests dans de grandes scènes.

Bien vu, je vais faire ça ( même si pour l’instant il n’y a que 3 ennemis de ce type ( et pas en même temps ))
En tout cas ça me sera drôlement utile plus tard :slight_smile: