2009-09-11 16 views
2

Nous avons mis en place un moteur multithread basé sur les tâches où un planificateur passe la tâche à la file d'attente sans verrous des threads. Le moteur est en C++ avec DirectX pour le rendu et nous utilisons boost :: thread pour créer les threads. En mode fenêtré, il ralentit au hasard pendant une seconde environ et accélère ensuite. Il semble que c'est quelque chose que Vista semble causer, mais nous ne pouvons pas trouver comment le résoudre correctement. Une chose que nous avons essayée qui semblait aider avec les ralentissements aléatoires était de faire dormir le thread pendant une milliseconde après que chaque tâche ait été traitée, mais cela cause d'autres problèmes et n'est pas vraiment une bonne solution.Moteur multithread Ralentissement aléatoire fenêtré

+0

Une file d'attente sans verrou? FUYEZ!!!! –

Répondre

0

avez-vous essayé d'exécuter le même code sous XP et Windows 7?

J'ai un code multithread qui rend les bitmaps compatibles hors écran. Chaque thread rend à son propre bitmap compatible. Cependant, pour une raison étrange, ce dessin prend AGES sur Vista. Je perds plus de 50% de mon temps de traitement au rendu GDI. Sous Win 7 et XP, je n'ai pas de tels problèmes. Fait intéressant, je suis tombé sur this article, ce qui implique que le rendu GDI multithread sous Vista est irrémédiablement brisé. À un moment donné, je vais essayer de trouver une méthode dans laquelle tout le rendu est fait par mon thread principal au lieu de threads auxiliaires pour tester si les performances de Vista s'améliore. Ce serait un énorme cauchemar d'une chose à coder si et mon marché primaire utilise XP, donc je ne suis pas al; Ce qui me préoccupe actuellement ...

+0

Je ne l'ai pas encore testé sous XP, mais il fait la même chose sous Windows 7. Comme le ralentissement se produit de manière aléatoire, avec les mêmes choses qui se passent à chaque image, je ne vois vraiment pas pourquoi le ralentissement se produirait. En fait, c'est moins comme un ralentissement et plus comme quelque chose bloque le fil pendant un certain temps. Le rendu commence à bégayer et le framerate descend de 370 à 200, puis remonte à la normale. –

+0

je pense avoir un profil est votre seul moyen d'avancer alors ... – Goz

+0

VTune démo de 30 jours est probablement la meilleure chose mais il vous faudra la plupart de ces 30 jours pour interpréter les données que vous obtenez en retour ... – Goz

1

La première chose que je recommanderais est de comprendre ce qui cause le ralentissement par le profilage. Jeter en dormition aléatoire est rarement une bonne idée (en parlant d'expérience ici, oui j'ai fait cela et oui j'ai corrigé cela plus tard) et ni ne spécule sur les sources de problèmes de performance en particulier dans un environnement multi-thread .

Visual Studio 2010 beta1 dispose d'un excellent profileur qui est parfait pour comprendre les causes des ralentissements dans votre application, Hazim Shafi's blog explique comment l'utiliser.

Vous pouvez également consulter l'outil XPerf qui est disponible dans le windows performance toolkit (vous devez utiliser le programme d'installation de la plate-forme sdk, mais vous ne besoin d'installer ce nœud il est en fait assez rapide).

+0

I don ' Je n'aime pas dormir et je cherche un moyen de m'en débarrasser et de régler le problème correctement. Je vais regarder dans VS 2010, je cherchais un bon profileur qui fait du threading, mais je ne pouvais trouver que le profileur Intel qui coûte trop cher. La raison pour laquelle je spécule que c'est quelque chose avec Vista est que le ralentissement se produit même quand il n'y a qu'une seule tâche pour le rendu, et le second noyau est laissé au ralenti. Dans la tâche de rendu, les éléments sont configurés à l'endroit où il ne fait que transmettre des données à DirectX, aucune allocation ou blocage ou tout ce qui pourrait provoquer des ralentissements. –

+0

vs 2010 est en version bêta en ce moment, donc c'est effectivement gratuit.La boîte à outils de performance Windows (xperf) est également gratuite, les deux devraient montrer la source du ralentissement, mais je pense qu'il sera plus facile de trouver dans le profileur vs 2010. Je pense qu'amd a aussi un profileur de threads qui est gratuit. – Rick