Baisse de performance dans un jeu DirectX sur win2000 - C++ - Programmation
Marsh Posté le 02-02-2003 à 15:44:13
(idée a la con, vite fait bien fait : t'as DX en mode debug ou release ?)
Marsh Posté le 02-02-2003 à 15:44:39
>> 1. lorsque j'initialise DirectMusic
peut-être un problème de drivers. je me souviens qu'à la sortie de 2000, il n'y avait pas de drivers spécifiques. certains fabricants ont mis longtemps à se mettre à jour, regarde de ce côté-là.
ou peut-être un mixing hardware sous 98 et software sous 2000. ou l'inverse.
>> 2. lorsque j'ai une triple boucle for.
aucune chance qu'un os ne rame à cause d'une triple boucle les valeurs de boucle sont-elles identiques sur les deux os ? tu fais quoi dans la boucle ? si c'est qq chose comme lecture en ram vidéo, ça peut encore être ramené à un problème de drivers.
Marsh Posté le 02-02-2003 à 22:09:28
j'ai dx9 version release.
Mes drivers sont tous a jour, même le son, j'ai ceux spécifique à 2000.
C'est quoi un mixing?
Marsh Posté le 02-02-2003 à 22:12:05
Bkadoum a écrit : C'est quoi un mixing? |
la façon de jouer plusieurs sons ensemble à différentes fréquences. ça peut être fait par windows ou par la carte. je me souviens avoir lu par ci par là des problèmes liés au mixing hardware qui bouffaient beaucoup de cpu. je ne vois que ça comme problème ... tu devrais peut-être demander sur hardware si ta carte son peut causer ce genre de problème.
Marsh Posté le 02-02-2003 à 23:03:45
ok je verrai ca, mais maintenant j'aimerai résoudre le problème de la boucle, car elle cause aussi un ralentissement. J'ai testé sans initialiser le son, ca ralentit toujours si je laisse cette triple boucle. J'ai essayé de faire la même triple boucle mais simplifiée, pour vous montrer, et bien ca ralentit toujours, voici le code:
Code :
|
Et j'ai remarqué que si au if, on enlève la deuxième condition, on a un petit gain de performance alors, vous pigez quelque chose? Si jamais, essayez d'appeler cette fonction en boucle dans un de vos programmes, lancez le sur win2000, ca ramera je suis sure!
Marsh Posté le 03-02-2003 à 01:19:04
c'est beaucoup de code si tu l'executes
beaucoup de fois par frame (meme une fois).
en plus je n'ai pas l'impression qu'il fait grand chose
ce code...
Tu peux pas transformer cette routine pour qu'elle soit plus rapide?
LeGreg
Marsh Posté le 03-02-2003 à 09:34:34
3 072 000 itérations quand même !
Attention, c'est && qu'il faut utiliser.
Tu peux essayer de compter vers 0, et de mettre le plus grand compte en dernier:
Code :
|
Ou alors de passer au pointeurs:
Code :
|
Mais c'est moins lisible, et l'optimiseur le fait peut-être déjà.
C'est vrai qu'elle est bizarre cette boucle... quel traitement fait-elle ?
Marsh Posté le 03-02-2003 à 12:51:39
Il ne peut pas y a voir des problèmes de segmentation de mémoire ? (question conne, je reconnais, mais je ne connais pas le modèle de gestion de la mémoire sous Win2K).
A part ça, je me demande si on ne pourrait pas réécrire la boucle comme suit :
Code :
|
Avantage : s'il n'y a rien à trouver, on ne fait que 4800 itérations maxi au lieu des 3 millions initiales.
Marsh Posté le 03-02-2003 à 12:58:01
non il fait pas grand chose, mais dans cet example, c'est juste pour vous montrer car si je vous envoie mon vrai code ce serait trop le bordel, faudrait que je vous envoie toues les sources des mes classes.
C'est vrai que ca fait beaucoup de traitement mais c'est tout ce que j'ai trouvé pour faire ce que je veux. En fait, les 2 première boucles servent à lire un tableau 2d qui correspond a des petits carrés d'images formant le décor de mon jeu (c'est le principe de tile engine). la troisième boucle c'est pour tester les collisions entres ces petits carrés et des autre objets du jeu, ces objets sont contenus dans un tableau.
Code :
|
Marsh Posté le 03-02-2003 à 13:04:19
Il n'empêche qu'en l'espéce il vaut mieux utiliser l'opérateur booléen "&&" plutôt que l'opérateur bit à bit "&" pour combiner tes conditions.
Et aussi complexe soit-elle dans ton propre code, je pense qu'en réécrivant ta boucle comme je l'ai indiqué, cela devrait diminuer sa complexité, donc améliorer son efficacité dans tous les cas. (par contre, je te déconseille de passer aux pointeurs comme l'a suggéré Musaran : il y a beaucoup d'autres optimisations à envisager avant d'utiliser celle-là, qui sacrifie énormément la lisibilité du programme, donc augmente de manière déraisonnable le risque qu'un bug s'y glisse...)
Marsh Posté le 03-02-2003 à 13:11:44
je comprends tjs pas ce que fait cette boucle Et doit surement avoir moyen de faire plus fin qu'une recherche exhaustive.
y'a quoi dans pos[i] ? ca correspond a quoi, la valeur contenue ?
Marsh Posté le 03-02-2003 à 13:55:47
Je vais toujours chercher trop loin moi, vous aviez raison, c'etait l'opératuer && qu'il fallait utiliser, la performance est maintenant égale a celle sur 98! Mais pourquoi? quelle est vraiment la différence entre & et &&? Je me suis toujours demandé, est-ce que les && peuvent aussi faire office de |?
Ok le problème 1 est réglé, merci! mais maintenant quand j'initialise le son ca ralentit pareil, mais vraiment pareil! les fps baissent au même taux, c'est fou!
Marsh Posté le 03-02-2003 à 14:12:09
"&" est un opérateur qui attend deux entiers en argument et retourne un entier. C'est un opérateur bit à bit. Par exemple, "11 & 3" renvoit 3, parce qu'en binaire "1011 & 0011 = 0011".
"&&" est un opérateur qui, logiquement, attend deux booléens en argument et retourne un booléen. En pratique, comme le type booléen n'existe pas formellement, "&&" renvoie zéro si les 2 arguments valent zéro, et il renvoie un sinon.
Ce qui signifie que "&&" est un opérateur beaucoup plus simple que "&", donc le compilateur va pouvoir optimiser beaucoup plus facilement le code qu'il génère.
Marsh Posté le 04-02-2003 à 04:32:41
BifaceMcLeOD: J'aurais dû voir cette optimisation.
D'accord pour les pointeurs pas lisibles.
Je persiste à trouver ce code étrange.
Code :
|
S'il y a des astuces au problème de collisons inter-sprite, ça m'intéresse aussi.
Marsh Posté le 04-02-2003 à 04:57:21
ben si il y a trois sprites a l'ecran
ca sert a rien de parcourir tout l'ecran a la recherche de deux sprites a la meme position:
tu fais un test pour chaque couple de sprite (n*(n-1)/2).
Et s'il y a du decor, pour chaque eleement mobile
tu testes s'il se trouve sur un element du decor (n tests avec n nombre de sprites).
De plus en subdivisant ton ecran en cases,
tu peux arriver a ne faire que tres peu de tests.
(subdivision binaire ou bien cases de taille fixes)
LeGreg
Marsh Posté le 04-02-2003 à 22:48:02
t'as raison Musaran, faut un tableau 2d pour le terrain, je l'ai fait mais pour les id de chaque tiles du tableau, dans cet example c'est des tableaux pour les coordonnées des tiles... bref, le problème de boucle est résolu.
Maintenant je cherche toujours une solution pour le son. J'ai découvert que le coupable dans l'initialisationde DirectMusic est la fonction InitAudio. Si je lui passe d'autres paramètres ca remonte les fps mais ne joue pas les sons, bien sûr!
Voilà ce que j'ai testé (pour ceux qui connaissent DirectMusic):
Code :
|
Voilà, ca marche sûrement pas car streaming n'est pas fait pour les wav et les midi mais y a aucune valeure pour ces types!
Marsh Posté le 04-02-2003 à 23:11:24
c'est une impression ou tu appelles initAudio
sur un pointeur non initialise?
LeGreg
Marsh Posté le 04-02-2003 à 23:33:23
de plus dans quelle mesure baissent tes perfs?
Si tu actives le synthe soft ca parait logique
que les perfs baissent "un peu",
ca fait un thread de plus avec lequel il faut se synchroniser.
reste a voir dans quelle mesure:
tu as des chiffres?
Legreg
Marsh Posté le 05-02-2003 à 00:09:53
Les perfs baissent de 50% par rapport à Win98! d'apres mon compteur, ca baisse de 80 à 40 fps!! Ca gène quand même beaucoup.
Le problème peut aussi venir que plusieurs sons peuvent être joués en même temps. J'ai fait une classe Sound regroupant les objets directmusic: IDirectMusicLoader8, IDirectMusicPerformance8, IDirectMusicSegment8. Chaque fois que je construis un objet Sound ca initialise le tout. J'ai vu que sur Win2000, plus tu construit de ces Sound plus les perfs baissent, alors que sur Win98 tu peux en créer autant que tu veux.
Bon, je suis crevé je verrai ca demain, merci pour l'aide et bonne nuit!
Marsh Posté le 05-02-2003 à 09:19:12
Ouais ca coule de source, j'ai essayé ce matin de construire 50 objets sounds. Sur 98: 80 fps. Sur 2000: 8 fps. A votre avis ca peut être dut à quoi? la mémoire?
Marsh Posté le 05-02-2003 à 11:24:09
Ce problème me fait penser à celui du jeu Grand Prix 4 ou quand tu passes sous 2000/XP, il rame pas possible à cause du son. Cela se résoud en désactivant l'accélération matériel du son (panneau de config -> son -> avancé ).
Est-ce que tu pourrais le faire pour ton programme. Le résultat m'intéresse (juste par curiosité) ?
Ca résoudra pas ton problème, mais ça pourrait aider à le comprendre.
Marsh Posté le 05-02-2003 à 11:50:27
ca change rien quand je mes l'accélération max, par contre l'accélération min ca rame encore plus!
Marsh Posté le 02-02-2003 à 14:47:15
J'ai un jeu 2D fonctionnant avec DirectDraw. Il marche bien sur Win98 mais sur Win2000, le nombre de flip à la seconde baisse énormément. J'ai remarqué que la cause de ce ralentissement vient de 2 problèmes différents:
1. lorsque j'initialise DirectMusic
2. lorsque j'ai une triple boucle for. Une double boucle sert à lire dans un tableau a 2 dimensions les coordonnées x et y et la troisième boucle sert à comparer les valeurs entre un tableau de coordonnées et les coordonées x et y. En gros c'est à peu pres ca.
Voila, c'est tres bizarre car sur win98 c'est tout a fait fluide. Peut être que win2000 supporte pas les 3 boucles, par contre je vois pas pourquoi il ralentit lorque j'active le son. Si quelqu'un connaît l'un ou l'autre de ces problème qu'il m'aide svp!