| [Edit]optimiser : pourquoi m'embêter ? | |
|
|
Auteur | Message |
---|
luuu17 Très bonne participation
Messages : 124
| Sujet: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 17:46 | |
| Bonjour, je met volontairement ce titre sachant que bien sur je sais quelle est la réponse, mais je m'explique :
je suis dans la fin de mon projet, je construit les niveaux et musiques, etc je fais les finitions. mon problème : je travaille sur un PC portable : Asus Intel Core 2.53 Ghz ram4Go Nvidia GT415M.
je suis un peu agacé de voir que quand je lance le jeu, ça "tourne" un peu aléatoirement : parfois, il se met à ramer pendant quelques secondes. parfois, il tourne de manière plus que correcte. Je n'arrive pas à trouver ce qui peut causer cela.
(sur un PC fixe bien plus performant le jeu tourne sans problème pour moi )
Ce qui m'agace, c'est que je regarde les performance en cours je deu avec Ctrl Alt Supr : UC utilisé passe d'une fourchette entre 0 et 3% si je ne fais rien à coté à 50-55% ( avec des pointes a 80% rares et pas systématiques mais tout de même toujours aux mêmes endroits du jeu me semble-t-il)
la mémoire passe de 1.25G -1.28G sans rien, à 1.54 environ en cours de jeu.
Surtout, après avoir passer pas mal de temps à virer des lignes de codes mal pensées, supprimer (beaucoup) des variables inutiles, remplacé des objets en tiles, ou supprimer pas mal d'objets dans une room, pour essayer de trouver des pistes à suivre pour améliorer ça, la "nouvelle" version me donne exactement les mêmes résultats. ( ça rame toujours un peu aléatoirement à certains endroits et les chiffres des performances sont identiques)
Qu'en pensez vous ? dois je insister ? Je ne cherche pas au bon endroit ? Quelques conseils ?
PS--> Ceci dit, le jeu tourne quand même correctement l'essentiel du temps mais tout ça me fait me dire que sur une machine un peu plus faible, on doit vite tomber dans le jeu qui rame tout le temps. Il reste sur cette machine largement jouable selon moi mais j'aimerais faire au mieux.
EDIT : les performances dans l'onglet processus : pour mon jeu lancé, la colonne processeur tourne entre 38 et 41 et la colonne Mémoire entre 199 000K et 202 000K pour la version retravaillée, même chose pour processeur et entre 197 et 198 000K pour la mémoire.
Dernière édition par luuu17 le Lun 5 Nov 2012 - 18:52, édité 1 fois |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 18:26 | |
| D'après mes souvenirs, GM va garder en mémoire tout ce que le jeu contient de pacqué dans l’exécutable. Donc même si tu n'utilise un background X qu'une seule fois dans le jeu, il seras gardé en mémoire pendant tout le jeu. Pareil pour toutes les autres ressources. Si tu as pleins de cartes dans ton jeu par exemple, toutes les rooms resteront en mémoire.
La solution? Elle est chiante... : n'utiliser que des ressources externes, et les charger que lorsque tu n'en a besoin. Le plus chiant étant pour les rooms évidement. Mais certains membres ont posté des scripts/moteurs tout pret pour ça.
Par contre pour les performances, pas sur que ce soit a cause de ce que j'ai évoqué précédemment. En général pour trouver un problème de perfs, on utilise le mode debug, et on vérifie les instances, car dans la majorité des cas c'est un soucis d'instances inutilisées qui ne sont pas détruites. Tu peut aussi regarder la ou tu utilise de grosses boucles, en général c'est ce genre de code qui demande le plus d'UC.
Il faut aussi savoir qu'afficher beaucoup d'objets par exemple, ou tester des collisions lorsqu'il y a beaucoup d'instances/tiles (si collisions par tiles) peut bouffer pas mal de perfs. |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 18:57 | |
| Je sais pas trop me servir du debug mode, je vais essayer de voir ce que je peux trouver avec. Je pense que je pourrais pas faire beaucoup mieux malheureusement mais bon je vais faire au mieux. |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 19:00 | |
| Est il plus intelligent par exemple :
de creer des objets (ennemis par exemple ) dans la room lorsque qu'on se rapproche d'un point prévu, ou vaut il mieux que l'ennemi y soit déjà placé ? sachant que pour créer cet ennemi, il faudra de toute façon que je place un objet "createur" dans la room. inutile ? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 19:04 | |
| Je pense que créer un objet qui fait spawn des ennemis c'est mieux. En plus tu peut faire en sorte qu'on puisse le paramétrer, et ça c'est cool :p |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 19:43 | |
| Dans le DEBUG mode , je n'arrive à rien afficher d’intéressant . Possible d'afficher l'UC utilisée ? par objets ? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 19:58 | |
| Dans le menu Tools t'as les trucs intéressants: Show Instance pour voir si ton jeu est pas saturé d'instances. Show Locale Variables pour voir un peu ce qui se passe dans une instance. Tu peut aussi executer du code.
Par contre pour l'uc go taskmgr :b |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 20:25 | |
| saturé d'instances, comment le savoir ? je vois la liste des instances, y'en a plein dans une room. genre 300. c'est pas bien ? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 20:40 | |
| Ben si le nombre d'instances reste constant et que c'est a peu près le même que celui que t'as dans ta room a la base, pas de soucis. Par contre 300 instances c'est pas mal, tu devrais désactiver les instances inactives.
|
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 21:08 | |
| ça reste constant et ça diminue même au fur et à mesure qu'on fait le niveau. je peux pas vraiment les desactiver sachant que je peux revenir en arrière.
les Sols et les Murs sont constitués d'un puzzle d'instances " bloc". c'est pas bien ? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 21:25 | |
| Pour la désactivation des instances je ne parlais que de celles qui sont en dehors de la view par exemple :b
Sinon pour les sols difficile de faire mieux avec GM j'ai l'impression. |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 21:32 | |
| Tu entends quoi par désactiver ? comment faire ? je me contente de les rendre " visible = 0" en dehors de la view. |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 21:53 | |
| Je cite la doc: - Code:
-
{ instance_activate_all(); instance_deactivate_region(view_xview[0],view_yview[0], view_wview[0],view_hview[0],false,true); }
Je te laisse aller la voir pour plus d'infos, et si t'as du mal avec l'anglais y a une version française dans un topic en post it dans la section GameMaker |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 21:55 | |
| ça semble intéressant effectivement ^^ je vais essayer ça merci en tout cas. faut que je mette ce code dans une instance toujours à l'écran alors |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Lun 5 Nov 2012 - 21:59 | |
| Oui, mais tu peut aussi faire un truc du genre: - Code:
-
{ instance_activate_all(); instance_deactivate_region(view_xview[0],view_yview[0], view_wview[0],view_hview[0],false,true); instance_activate_object(tonObjet) } De cette manière tu peut empêcher la désactivation d'objets importants, comme le GUI. |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 15:07 | |
| Qu'appelles-tu le GUI ? la taille de la room joue pas mal aussi à ce que je vois. En fait je me rend compte que c'est vraiment niveau UC que ça bouffe beaucoup trop. je sais ou j'ai énormément de lignes de codes, ou on peut surement faire mieux, mais je suis pas très fort et je pense pas que je pourrai mieux faire là dessus.
[Edit] pour les collisions : il vaut mieux utiliser un "disk" ou rectangle manuel ou utiliser "precise collision checking" ? |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 15:31 | |
| Si tu veux quelques conseil (pas forcément très utile pour un initié, mais comme je sais pas si tu débute...) : -utiliser un maximum de boucles, ca réduit énormément la taille des fichiers, en plus d'être plus rapide lors de la compilation et en jeu. En plus c'est beaucoup plus simple à modifier après coup. -tu dois jamais avoir plusieurs fois le même bout de code, utilise plutot des fonctions, plus clair, plus rapide et toujours plus simple à modifier -limiter le nombre d'objets (pas seulement le nombre d'instance dans la room, mais aussi le nombre d'objet dans GM) : faut pas que t'ai un objet heros, une autre objet heros_blessée, puis heros_mort, heros_avec_bonus,etc... t'utilise des variables, c'est à sa que ca sert -utilise l'héritage : même si avec GM c'est ******, c'est mieux que rien... -et enfin otimise dès le dbut, te dis pas "je le ferais à la fin", parce que c'est pas vrai, à la fin tu le fera pas Voilà, comme dit c'est pas forcément utile si t'as déjà de bonnes bases, mais c'est déjà ca edit: précise collision est forcément plus long que les autres, mais tout dépend du type de jeu. |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 15:54 | |
| ^^ Je suis débutant plutôt, enfin ça fait super longtemps que je m'en sert j'arrive à faire plein de choses dont je suis content, mais niveau programmation, j'arrive à faire ce que je veux, ça fonctionne, mais c'est très mal fait je crois. (moi mon truc c'est plutôt le game design)
-les boucles : j'en utilise aucune. je sais que c'est mal, mais sérieusement dans tout ce que j'ai mis je vois pas un endroit ou je peux mettre une boucle. ( je met que des if et des else : if je me fait toucher, vie -=1, etc etc )
- jamais avoir plusieurs fois le même bout de code ? je comprends pas exactement ce que tu veux dire
-limiter le nombre d'objets : alors la je me suis dit ça aussi, mais je sais pas comment faire autrement. Chaque élément du jeu interactif doit forcément être une instance non ? chaque ennemi, chaque décor ( s'il a un role ) de plus mon Héros est partagé entre beaucoup d'objet car je suis incapable de représenter un personnage annimé correctement. du coup, il a une tete, des mains, et pieds que j'ai géré à part. comme ça j'arrive à avoir une animation potable (il a un look rayman)
-j'ignore ce qu'est l'héritage ^^
j'essaie tout de même d'optimiser car je suis maintenant à la fin, ou en tout cas la dernière partie.
---> quand le personnage tire : il se crée un objet "laser" qui part dans une direction donée et qui a un code qui lui dit de se detruire s'il rencontre un mur, ou un ennemi . donc ça ressemble à ça pour l'objet laser :
if collision_line(x,y,x+hspeed,y+vspeed,Mur,true,true) { speed = 0 move_contact_solid(direction,10) instance_create(x,y,etincelle) instance_destroy() }
voilà je fais tout à peu près comme ça mais y'a des trucs bien plus compliqué. c'est juste un exemple pour voir si je peux faire la même chose mieux. |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 16:24 | |
| Pour les boucles, je me répète, mais essaie quand même de les utiliser, et sinon, si t'utilise beaucoup de conditions, intègre des switch, je te laisse regarder dans la doc pour plus d'infos. Ensuite, quand je parle de plusieurs fois le même bout de code, c'est quand par exemple, le dinosaure et le gremlins (fais pas gaffe aux exemple...) ont la même réaction quand ils se font buter : par exemple si les deux font un bruit d'agonie puis disparraise, tu fais une fonction mourrir(id) qui joue un son d'agonie et qui détruit l'objet d'id "id" donné en argument : fonction mourrir(id) - Code:
-
play_sound(agonie); with(argument0) { instance_destroy(); } Là aussi je te laisse regarder dans la doc pour plus d'infos. Ensuite pour limiter le nombre d'instances : -pour les décors : - s'ils ne servent que de décors, utilise les tiles, pas besoin d'objet. -s'ils ne servent que de murs ou d'autre objet solide ou l'on peut marcher, tu fais un objet mur avec un simple carré noir en sprite, et tu rajoute ensuite des tiles par dessus, comme ca t'a un seul objet et ils peuvent tous avoir un aspect différent -pour ton perso : c'es pas très optimisés, mais c'est vai que je sais pas trop ce que tu pourrais faire à la place... Ensuite, l'héritage : en gros tu fais un objet de base qui n'apparaitra pas forcément dans le jeu, par exemple l'objet enemie, tu lui met l'algo pour se déplacer, recevoir des dégats,ect... et ensuite tu fais tous tes ennemis : par exemple l'objet dinosaure et l'objet gremlins : en bas à gauche, là ou tu change le nom, le sprite,etc.. de ton objet, ia un truc du genre parent, là tu met l'objet ennemie Ensuite, même si ia aucun code dans ton objet gremlins (ou dino peut importe), il fera pareil que son parent, c'est à dire l'objet ennemie. Ensuite, si tu veux par exemple que le gremlins ai un coeur au dessus de lui mais pas les autres objets, tu va dans l'event draw, tu rajoute ton code pour afficher le coeur et faut appeler une fonction (je sais plus sonnom désolé) qui execute en plus le code du parent, sinon t'aura plus le code de l'event draw de l'objet ennemie dans ton ojet gremlins. C'est pas très clair désolé, mais si tu regarde un peu dans la doc et dans les tutos ca devrait aller... Ensuite dernier truc, il ne faut jamais créer d'objet juste pour l'affichage !! ; utilise les particules pour faire des étincelles, en plus tu pourra faire plus joli plus facilement |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 18:25 | |
| Ok merci beaucoup, je cours me renseigner sur le switch. pour les particules également. pour parent, je savais et m'en sert déjà. Je vois un peu ce que je peux faire pour certains trucs, mais d'autres je pense en revanche que je pourrai pas faire grand chose de mieux (avec ma cervelle). Tout de même , il faudra peut être aller au CERN pour faire tourner mon jeu, mais il sera pas mal ^^ j'en suis content. |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 22:00 | |
| Un truc très très très utile et que très très très peut de monde connais c'est le code de création d'instance. Quant tu place un objet dans l’éditeur de salle si tu fait "ctr+clic_droit" tu va avoir l'option "creation code" et elle est là la magie. Tu peut mettre une variable genre "ID" à la création de l'instance ensuite dans ton objet tu peut faire: - Code:
-
switch( ID ){ case 0: text="Bienvenue dans le jeu."; break;
case 1: text="Pour vous déplacer utilisez les touches fléchés."; break;
default: text="..."; }
Et voilà comment avoir plusieurs pancartes d'aide avec un seul objet. Ensuite pour compléter ce que dit Térence68 sur les scripts voici encore mieux. obj: - Code:
-
text= getTextGame(ID); Et voici le script "getTextGame": - Code:
-
var text;
switch( argument0 ){ case 0: text[FRENCH]="Bonjour."; text[ENGLISH]="Hello."; text[SPANISH]="Hola."; break; //etc... }
return text[global.language];
Alors bien-entendue pour que ce code fonctionne tu doit créer la variable "global.language" qui aura comme valeur FRENCH, ENGLISH ou SPANISH et bien entendu c'est variables sont des constantes (très peut connus par les utilisateurs de GM mais terriblement puissantes). Si tu veux un exemple je peut te faire ça. |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mar 6 Nov 2012 - 22:31 | |
| Dommage qu'on soit obligé de passer par la avec GM, alors que dans tous les langages un minimum objet il suffit d'instancier avec un paramètre supplémentaire :/ A mes débuts je faisait un truc tout con: ins code: message = "blablabla" Et dans le create de l'objet if(!variable_local_exists("message")) message = "" D'ailleurs on peut même rien mettre dans le create pour pas utiliser une fonction qui seras par la suite obsolète Ça évite d'avoir plusieurs conditions exécutés par instances, et on peut rendre le code plus propre en créant une fonction 'Constructeur' pour chaque objet. Par exemple pour l'objet Message: - Code:
-
draw_text(x, y, msg) script CMessage: - Code:
-
msg = argument0 Et dans chaque code d'instance on peut facilement utiliser le constructeur de l'objet Message. |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mer 7 Nov 2012 - 14:15 | |
| J'avais vu en effet le creation code quand je place un objet dans la room, je m'en suis servi pour quelques trucs. ( genre un piège qui est un plafond de pics qui tombe i+=1 et quand i = 100 le plafond tombe. je me sert alors de creation code pour initialiser i a des valeurs différents pour que les plafonds ne tombent pas tous en même temps.
J'ai fait un test et je suis un peu surpris : j'ai supprimé beaucoup d'objets, ceux qui sont les plus complexes, en fait j'ai supprimé tout le codage de ces objets, ceux qui utilisent beaucoup de fonctions, degtorad, point_direction , et qui utilisent pas mal de variables, pour voir ensuite si j'avais une différence, mais les performances restent inchangées ; toujours entre 38 et 42 en UC et un peu moins en mémoire (195 000).
Je me dit alors : j'ai peut être un seul objet qui met un peu la zone et je ne l'ai pas trouvé ? ce que j'ai supprimé n'étais pas si mal ?
je précise encore que je suis pas du tout programmeur dans l'ame, j'ai du m'obliger pour réaliser ce petit projet, j'ai acquis quelques bases et je fais avec, et je recommencerai pas depuis le début ^^ merci encore pour tous ces conseils en tout cas.
[Edit] je n'utilise jamais l'event draw. j'ai pas bien compris l'interêt et des que je m'en sert, c'est la galère. j'ai l'impression de tout compliquer. tous mes sprites sont associés à un objet et si j'ai besoin de le changer , j'utilise dans l'event step :
exemple simple :
if vie = 0 { sprite_index = mechantmort } |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: trouvaille Mer 7 Nov 2012 - 15:21 | |
| Je viens de trouver quelque chose, à force de supprimer des objets ou des choses, et de comparer les performances affichées dans le gestionnaire des tâches de windows.
à force de supprimer nombre de vieilles variables inutiles, remplacées par une seul en trouvant un code différent, j'ai fait descendre légèrement la mémoire utilisée. ça je l'avais déjà trouvé.
mais l'UC donc, comme je l'ai dit plus haut, reste stagnant entre 38 et 41 environ, sauf sur la dernière manip que je viens de faire : l'UC passe a 30-32. ce qui fait une bonne différence non ? ce que j'ai fait : j'ai simplement supprimé des sons ( et le code les faisant intervenir) je m'explique : j'ai créé pas mal de sons bruitages, j'en ai en wav ( bruit de flingue, explosions, choses comme ça) des mp3 pour la musique d'autres wav qui sont des voix enregistrées : je faisais parler certains ennemis pour voir si c'était rigolo, et je l'ai laissé : mais j'ai créé pas mal de voix différentes qui sont lancées alors aléatoirement : if point_distance(x,y,Heros.x,Heros.y) < 200 { if hasard = 1 sound_play(bonjour) if hasard = 2 sound_play(salut) if hasard = 3 sound_play(coucou) }
(je me dis d'ailleurs que c'est un beau cas ou j'aurai pu mettre " case " à la place des if)
c'était un peu pour m'amuser et depuis que j'ai supprimé ça et les sons avec , ( y'en avait pas mal) les performances affichées sont donc passé de 40 a 30 grossomodo pour l'UC utilisée. qu'en pensez vous ? |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mer 7 Nov 2012 - 15:27 | |
| GM gère très mal les sons, c'est pas nouveau, donc faut les rajouter à la fin, t'as 2 fois moins de chargement sans eux.... Et sinon, t'utilise quoi comme truc pour faire des voix ? Ca m'intéresse |
|
| |
luuu17 Très bonne participation
Messages : 124
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? Mer 7 Nov 2012 - 17:55 | |
| rien de bien poussé, je m'enregistrais sur le magnétophone et avec audacity je rajoutais quelques effets et augmentais la vitesse ^^ |
|
| |
Contenu sponsorisé
| Sujet: Re: [Edit]optimiser : pourquoi m'embêter ? | |
| |
|
| |
| [Edit]optimiser : pourquoi m'embêter ? | |
|