consommation 80% du cpu - D'où ca vient ? - C++ - Programmation
Marsh Posté le 15-03-2012 à 20:04:18
Hmm, tu utilises SDL_PollEvent() qui ne fait aucune attente. Du coup, d'après ton code, si tu n'appuies sur aucune touche => 100% d'utilisation du CPU.
Tu pourrais regarder les fonctions SDL_WaitEvent et SDL_AddTimer() pour faire un truc un peu plus sympa pour le CPU. Fait attention à la précision des timers, ça tourne autour de 10/15ms sous Windows.
Aussi, j'ai le souvenir que sous Linusque, les perfs ne sont vraiment pas terribles (edit: avec la lib SDL, hein, c'est pas vraiment linusque le problème )
Marsh Posté le 15-03-2012 à 20:09:31
Bonjour
Pour répondre à ta question:
Sur le Site du zéro il parle de:
«si vous utilisez SDL_WaitEvent votre programme utilisera très peu de processeur car il attendra qu'un évènement se produise»
http://www.siteduzero.com/tutoriel [...] e-1-2.html
et de
«SDL_Delay peut donc être utile pour réduire l'utilisation du processeur»
http://www.siteduzero.com/tutoriel [...] temps.html
Sinon, si tu veux faire du C++
N'utilise pas les entête C
#include <stdlib.h>
#include <stdio.h>
Remplace la SDL par la SFML
http://www.sfml-dev.org/index-fr.php
Marsh Posté le 15-03-2012 à 21:01:10
Mouais, WaitEvent est pas ce qu'il faut pour du temps réel, vu qu'il freeze le programme jusqu'à ce qu'une touche soit pressée (à moins de le foutre dans un thread)
Par contre, t'as foutu le contrôleur de framerate dans le cas d'une touche pressé, faut pas. En gros ta boucle principale se fait comme ça :
- On gère les évements (PollEvent)
- On exécute chaque code de chaque objet (gestion des déplacements et compagnie)
- On dessine chaque objet
- On flip l'écran
- On calcule le temps à attendre (SDL_Delay())
Marsh Posté le 15-03-2012 à 22:57:00
Merci à tous, pour ces bons conseils.
Je vais quand même rester sur de la SDL, même s'il y a plus performant.
J'ai complètement repensé la manière dont je gérais la pression des touches pour qu'on puisse en presser deux d'un coup et maintenant j'ai une utilisation du cpu qui varie de 16 à 20% ça me semble plus raisonnable. Je remets mon code (qui gere maintenant les déplacements en diagonale et les animations)
Voilà la boucle de mon main, j'utilise maintenant in qui est le tableau des touches enfoncées
Code :
|
Je vous mets les fonctions principales de Affichage.cpp :
- un gros case tout moche pour l'affichage du personnage suivant la direction et la frame ou on est :
Code :
|
- La fonction qui remplit le tableau de touche enfoncé
Code :
|
- la fonction qui remplit in le tableau des touches enfoncées
Code :
|
Le problème que j'ai, c'est que j'ai pas trouvé d'autre solution que de passer in en paramètre globale de la class affichage
En essayant de créer un fonction "renvoitIn" j'avais des problèmes de compilation de plus je ne sais pas ou définir la structure Input :
Code :
|
(pour l'instant definit dans Affichage.cpp)
Je présents que c'est un problème de passer une fonction en pointeur ou un truc du genre mais je suis dans le vague.
Marsh Posté le 15-03-2012 à 23:29:35
T'es pas obligé de mettre ton code update / déplacer et compagnie après le if pour la gestion du framerate, SDL_Delay() met le programme en pause, en gros aucune instruction n'est exécutée tant que le temps d'attente n'est pas fini.
aussi, typedef est inutile dans ton code, struct Input { }; suffit
Pour la SDL, tu peux directement récupérer l'état des touches :
Code :
|
Marsh Posté le 16-03-2012 à 21:54:24
Merci pour les conseils,
J'avais le code que tu propose avant mais il ne gère pas le fait que l'utilisateur appuie sur deux boutons en même temps.
Et pour le SDL_Delay(), il me semble que faire comme je fais permet d'avoir des intervalles de temps entre chaque image plus réguliers.
Marsh Posté le 17-03-2012 à 02:07:43
Ben pour les deux touches à la fois, tu fais par exemple "if (keystate[SDLK_LEFT] && keystate[SDLK_A] )",ça marche pas ?
Et pour le SDL_Delay, je sais pas trop, ça m'étonne un peu..
Marsh Posté le 15-03-2012 à 17:50:09
Bonjour à tous,
Je me lance dans le C++ et la bibliothèque sdl pour essayer de coder un truc très simple pour l'instant : un personnage qui se balade sur un terrain vue de 3/4.
J'en suis à l’étape où mon personnage "glisse" (pas d'animation de marche pour l'instant) sur le terrain.
Et j'ai un problème que j'aimerais régler avant d'aller plus loin un consommation de 80% du cpu lors de l’exécution... Je trouve ca un peu excessif, dites moi si je me tompe. (d'un autre coté je viens de remarquer que firefox en utilise 64%)
Voici le code (je suis ouverts à tout conseil/remarque/insulte) :
Et le code de Affichage.cpp dans la foulé :
Merci d'avance.