CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Conseils pour optimiser mon code C++/SDL

clements01_c
clements01_c
Niveau 7
04 août 2012 à 20:32:09

Salut à vous,
Je débute avec la SDL et la programmation de jeux, et j'aimerai de l'aide pour optimiser mon code.

j'ai récemment commencer à réfléchir à un projet de RPG (un truc basique dans le but d'apprendre), pour ça, j'ai décidé de développer mon propre éditeur de carte afin de découvrir un peu tout ça.

J'ai donc fait cet éditeur de map en C++/SDL, comme le sera ce RPG, mais j'ai cependant besoin d'aide, mon éditeur fonctionne à peu près, j'ai encore quelques améliorations à faire pour la sauvegarde et le chargement de niveaux à éditer.

J'ai besoin d'aide pour optimiser et mieux organiser mon code, j'ai voulu dans ce code me servir d'une classe "Moteur" et d'énumération, le souci c'est que pour le moment cet éditeur grignote 90% d'un core de mon processeur, j'imagine que quelque chose ne vas pas dans ma boucle.
C'est pourquoi je me demandais comment mieux organiser tout ça.

Voici les sources, avec le fichier de projet CodeBlocks: http://www.noelshare.com/files/get/tQnoxD92UW/editeur-niveau-rpg.zip

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

clements01_c
clements01_c
Niveau 7
04 août 2012 à 21:43:59

J'ai donc bien fait de vous donner ça car chez moi ça ne crash pas, donc je n'aurai pas pu le remarquer.

Aussi si quelqu'un essaie de recompiler tout ça, faudra pas oublié de retirer le commentaire au début ("PAS ENCORE AU POINT") du main, car la variable "level" est utilisée dans le code.

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

godrik
godrik
Niveau 30
04 août 2012 à 22:17:45

quelques commentaires:
Le destructeur de moteur desalloue apercu, vide, air et terre. Mais il ne verifie pas si ils ont bien ete alloue. en particulier apercu est juste un pointeur sur quelquechose d'autre (vide, air ou terre). Donc tu ne devrias pas le desalloue.

J'imagine que ces variables correspondent aux sprites que tu affihce pour quand tile[i][j] est APERCU, VIDE, AIR ou TERRE. Je te recommanderai d'utilise un tableau de SDL_Surface que tu indice avec la valeur de l'enum
tu veux pouvoir faire facilement sprite[VIDE] ou sprite[AIR]. Ce qui te servira certainement pour simplifier ton affichage. Ca reduira egalement la longueur de ton code.

A plusieurs endroit dans ton code on retrouve des "event.button.x / TILE_SIZE" qui servent certainement a mapper une coordone souris sur une tile de ton jeu. Tu devrais faire une fonction qui fait ce calcul pour toi. Plus tard, tu aura certainement une interface plus complexe et du scrolling sur ta map. ce calcul qui est pour l'instant simple va devenir plus compliquer. Fais une fonction "int map_user_coordinate_to_tile_x (int x){return / TILE_SIZE;}" ca te simplifiera la vie plus tard.

De facon generale, prefere "++i" a "i++". (l'intention est plus clair pour le compilateur et te gagnera des performance que tu aura des iterateurs.)

"fseek(fichier,level * 627, SEEK_SET);"
D'ou vient ce 627 exactement?

Dans load tu as des case '1', case '2'. Tu vas faire quoi quand tu aura plus de 10 types?

Bon maintenant, j'essaye de le compiler.

godrik
godrik
Niveau 30
04 août 2012 à 22:22:38

En passant, la ligne de compilation qui va bien pour linux

g++ *.cpp `sdl-config --cflags` `sdl-config --libs` -l SDL_image -o editeur

Poneymovez
Poneymovez
Niveau 9
04 août 2012 à 22:22:57

"De facon generale, prefere "++i" a "i++"." dire que j'ai appris ça grâce au modding minecraft. Il incrémente et lis la valeur ensuite. Le i++ lis la valeur, incrémente, et lis la valeur incrémenté. C'est ça la différence il me semble.

Bref, ++i > all ! :hap:

godrik
godrik
Niveau 30
04 août 2012 à 22:24:18

Ah, je sais pourquoi c'est lent.

Dans main tu fais provoque un affichage pour chaque evenement de ta boucle d'evenement. Mais quand tu bouge la souris, ca genere ENORMEMENT d'evenement. tu ne devrai afficher qu'une fois tous les x millisecondes.

clements01_c
clements01_c
Niveau 7
04 août 2012 à 22:49:16

Je vous remercie grandement pour votre aide, je vais m'attarder sur tout les points que vous avez souligné demain matin, là je suis trop fatigué héhé.

Et sinon, pour ce qui est de l'organisation de mon code, est-ce que vous avez des conseils ? Est-ce que ma classe Moteur est une bonne idée ? Des améliorations à faire sur ce point ?

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

clements01_c
clements01_c
Niveau 7
05 août 2012 à 01:12:41

Aussi, je voulais savoir votre avis, sur si je devrai me mettre à la librairie SFML qui est plus récente et gère nativement plus de choses que la SDL et est plus adaptée je pense pour le C++ car orientée objet.

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

LGV
LGV
Niveau 28
05 août 2012 à 08:59:16

un bon profiler sous GPL :

http://www.codersnotes.com/sleepy/

Et pour les optims, il faut faire ca dans l'ordre, i.e. architecture > algorithmes > structures de donnees > "local" (naivete du code, astuces, etc.) > bas niveau

Ca ne sert a rien de passer des jours a optimiser a mort un truc qui au final n'a pas un impact notable sur les perfs principales.

Mais ici il semble que godrik a mis le doigt sur ce qui ne va pas :D

Pour le code en lui meme, qq remarques:
- preferer les static const aux define pour les constantes
- l'encapsulation laisse a desirer, avec tout un tas de trucs publics qui n'ont surement pas lieu de l'etre dans l'interface exposee au reste du code
- il y peu de source, donc pas grand chose a dire sur l'archi ; ta classe Moteur risque de souffrir du syndrome "monolithique" (un gros truc enorme qui sert a tout, et qui au final n'a pas vraiment de structure en soi). Donc bien penser la separation des concepts quand tu rajouteras des fonctionalites

L'archi et la conception logicielle est un GROS morceau en soi, donc il est difficile de resumer les conseils utiles, mais je citerais 2 references
- Large Scale C++ Software Design
- Design Patterns: Elements of Reusable Object-Oriented Software

qui te seraient utiles plus tard si tu souhaites approfondir, et qui repondront surement aux problemes que tu auras en commencant a faire des programmes plus consequents

LGV
LGV
Niveau 28
05 août 2012 à 09:01:36

(je cite ces 2 bouquins pour reference future, mais je deconseille de s'y plonger trop tot, avant de s'etre fait les dents sur les problematiques courantes. C'est le genre de truc a voir avec qq annees de progammation "amateur" dans les pattes)

clements01_c
clements01_c
Niveau 7
05 août 2012 à 14:01:30

Merci pour toutes ces informations.

@godrik

Le "fseek(fichier,level * 627, SEEK_SET);" ça sera pour le chargement ou la sauvegarde de niveau, je souhaite faire un niveau par ligne dans mon fichier niveaux.lvl, une ligne fait 625 caractères (pour chaque tile) + 2 caractères pour le retour à la ligne (\n).

J'ai rajouté un SDL_Delay(10);
avant mon SDL_BlitSurface(apercu, NULL, ecran, &positionSouris);

Visiblement ça a rendu tout ça beaucoup moins gourmand, c'est une bonne chose.

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

lemokh
lemokh
Niveau 5
05 août 2012 à 18:52:59

Heu, le "\n" c'est un seul caractère, pas deux.

godrik
godrik
Niveau 30
05 août 2012 à 18:55:27

"une ligne fait 625 caractères (pour chaque tile) + 2 caractères pour le retour à la ligne (\n)"

Je vois. De facon general on appelle ca des "magic numbers". Il s'agit de nombres qui apparaissent dans le code et dont le role n'est pas clair. Je te conseille de mettre une variable TAILLE_D_UN_NIVEAU_DANS_UN_FICHIER ou tu calcul explicitement cette valeure.

"J'ai rajouté un SDL_Delay(10); avant mon SDL_BlitSurface(apercu, NULL, ecran, &positionSouris);"
Mais ca ne va certaiement pas regler le probleme. Le probleme est qu'il y a plus de 1 evenement par frame de generer quand tu bouge la souris. Donc les evnement s'empile et sont traiter un a un. Regarde la notion de event loop sur google.

Globlamenet, il faut traiter tous les evenement dans la queue avant d'afficher quoi que ce soit. Grossierement:
while (!quit){ while (SDL_poll_event){ /*process ALL events*/} Display_new_frame_but_not_more_than_60_per_seconds
();
}

godrik
godrik
Niveau 30
05 août 2012 à 21:08:07

NE CLIQUEZ PAS SUR LE LIEN AU DESSUS. c'est un lien de pub.

clements01_c
clements01_c
Niveau 7
05 août 2012 à 21:13:20

Je vois, merci pour toutes ces infos, je vais m'occuper de ça.

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

clements01_c
clements01_c
Niveau 7
05 août 2012 à 21:53:10

Ok j'ai lu la page Wikipédia sur les Magic Numbers, je comprend en effet que ce n'est pas pratique du tout pour la compréhension du code (la preuve).

Je vais faire en sorte de ne pas en avoir dans mon code.

______________________________________
https://image.noelshack.com/fichiers/2012/25/1340475499-f2cf4_makise-crop.jpg

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware