SDL_PollEvent vs SDL_WaitEvent
J'ai donc été la lecture de cet article, qui contient des "Trucs et Conseils pour la Programmation Multithread en SDL' - https://vilimpoc.org/research/portmonitorg/sdl-tips-and-tricks.html
Il parle de SDL_PollEvent être inefficace, car il peut provoquer un excès de l'utilisation du CPU et donc recommande d'utiliser SDL_WaitEvent à la place.
Il montre un exemple de deux boucles, mais je ne vois pas comment cela pourrait fonctionner avec une boucle de jeu. Est-ce le cas que SDL_WaitEvent doit être utilisé uniquement par des choses qui ne nécessitent pas de mises à jour constantes c'est à dire si vous avez eu un jeu de course, vous effectuez jeu de logique de chaque image.
Les seules choses que je peux penser qu'il pourrait être utilisé pour des programmes comme un programme de peinture où il y a seulement l'action en faveur de la saisie de l'utilisateur.
Ai-je raison de penser que je devrais continuer à utiliser SDL_PollEvent générique de programmation de jeu?
source d'informationauteur Zammalad | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
Si votre jeu est uniquement les mises à jour/repeint sur la saisie de l'utilisateur, vous pouvez utiliser SDL_WaitEvent. Cependant, la plupart des jeux en animation/physique se passe même quand il n'y a aucune entrée d'utilisateur. Donc, je pense que SDL_PollEvent serait le mieux pour la plupart des jeux.
D'un cas dans lequel SDL_WaitEvent peut être utile si vous avez ça dans un thread et votre animation/logique sur un autre thread. De cette façon, même si SDL_WaitEvent attend pour une longue période de temps, votre jeu va continuer à peindre/mise à jour. (EDIT: Ce ne peut pas réellement le travail. Voir Henrik commentaire ci-dessous)
Comme pour SDL_PollEvent à l'aide du PROCESSEUR de 100% comme l'article indiqué, vous pourriez atténuer que par l'ajout d'un sommeil dans votre boucle lorsque vous constatez que votre jeu est en cours d'exécution de plus que nécessaire images par seconde.
Si vous n'avez pas besoin de sous-trame de précision dans vos commentaires, et votre jeu est en constante animation, puis SDL_PollEvent est approprié.
La sous-trame de précision peut être important, par exemple. des jeux où le joueur pourrait vouloir très petits incréments de mouvement appuyant rapidement sur et le relâchement d'une touche a un comportement imprévisible si vous utilisez la classique méthode paresseuse de keydown pour dire "vitesse = 1" et keyup pour dire "vitesse = 0" et ensuite, vous n'position de mise à jour une fois par image. Si votre robinet arrive à se chevaucher avec le cadre de rendu, puis vous obtenez une image-de la durée de mouvement, si ce n'est pas vous n'obtenez pas de mouvement, où ce que vous avez vraiment voulez est une quantité de mouvement plus petite que la longueur d'un cadre basé sur les horodateurs à laquelle les événements se sont produits.
Malheureusement SDL événements ne comprennent pas la situation réelle, les horodatages du système d'exploitation, seul le timestamp de la PumpEvents appel, et WaitEvent efficacement les sondages à la de 10 ms à intervalles, de sorte que même avec WaitEvent exécute dans un thread séparé, le plus de précision est de 10 ms (vous pourriez peut-être approximatif, plus petit, en disant: si vous obtenez un keydown et keyup dans le même cycle d'interrogation puis c'est ~5 ms).
Donc, si vous voulez vraiment chronométrage de précision sur votre entrée, vous pourriez vraiment besoin d'écrire votre propre version de SDL_WaitEventTimeout avec une petite SDL_Delay, et exécuter que dans un thread séparé à partir de votre jeu principal de la boucle.
Malheureusement, SDL_PumpEvents doit être exécuté sur le thread qui a initialisé le sous-système vidéo (par https://wiki.libsdl.org/SDL_PumpEvents ), donc l'idée de l'exécution de votre boucle d'entrée sur un autre thread pour obtenir des sous-trame, le timing est mis son veto par le SDL cadre.
En conclusion, pour les applications SDL avec l'animation, il n'y a pas de raison d'utiliser autre chose que SDL_PollEvents. Le meilleur que vous pouvez faire pour les sous-taux de rafraîchissement d'entrée de précision est, si vous avez le temps de brûler entre des cadres, vous avez la possibilité d'être précis au cours de cette période, mais ensuite vous aurez bizarre rendu de la durée de windows chaque image où votre entrée perd en précision, si vous vous retrouvez avec un autre type d'incohérence.
En général, vous devez utiliser SDL_WaitEvent plutôt que de SDL_PollEvent pour libérer le CPU au système d'exploitation pour gérer d'autres tâches, comme le traitement de la saisie de l'utilisateur. Cela va se manifester à vous utilisateurs que l'atonie de la réaction à la saisie de l'utilisateur, car cela peut entraîner un retard entre le moment où ils entrent dans une commande et lors de votre processus de demande de l'événement. En utilisant SDL_WaitEvent au lieu de cela, le système d'exploitation peut afficher les événements à votre demande plus rapidement, ce qui améliore la performance perçue.
D'un autre côté, les utilisateurs, alimenté par batterie, les systèmes, comme les ordinateurs portables et les appareils portables doivent voir un peu moins l'utilisation de la batterie depuis l'OS a l'occasion de réduire l'ensemble de la CPU usage depuis votre jeu n'est pas à l'utiliser à 100% du temps -, il ne serait que de l'utiliser quand un événement se produit réellement.
Je suis venu ici parce que j'étais curieux de connaître la SFML PollEventa vs WaitEvent. Et effectivement découvert une nouvelle bibliothèque graphique je doit apprendre.
Pourquoi est-ce que ces GPU bibliothèques sont tellement en manque? À partir de windows.h à SFML pour OpenGL et maintenant SDL. Les programmes normaux, ne se comportent pas comme ça. Les programmes normaux, comme Xilisoft Convertisseur Vidéo, VLC player, Microsoft Office pour pleurer à haute voix certainement utiliser plus de ressources que notre amateur de programmes. Microsoft Office est de plus de 30 mo d'espace disque dur de nos programmes, à peine à 5 mo. Pourtant ils n'utilisent pas n'importe où près de 100% de CPU. Je peux courir tous les trois un temps et ont encore des unités de traitement. Alors pourquoi devrait-ma merde programme utiliser 100% du CPU en lui-même?
Puis j'ai réalisé que les programmes officiels ne dors! Ne fait pas de sens de faire de la constante inutile boucles et vérifie! C'est le problème avec PollEvents. Vous n'avez jamais besoin d'être constamment en boucle de votre programme, ou au moins chaque pouce de celui-ci. Je laisse VLC lecture de vidéos et il n'est pas max mon CPU.
Ce pilote m'vers l'utilisation d'attente de l'événement qui a mené moi d'apprendre le multi-threading. Parce que pour une raison étrange, je ne peux pas gérer les événements sur le thread, si vous utilisez l'attente de l'événement.
Mais le filetage de votre programme prend de l'essai et l'essai et l'erreur. Mais je crois que le CPU avantages en valent la peine. J'ai quatre fenêtres en cours d'exécution sur quatre fils et mon CPU atteint à peine 20%. Et rappelez-vous ceci, si votre programme est fait de 100% sur votre ordinateur, il peut ne pas s'exécuter sur un autre ordinateur. Un peu d'expérience de la mine.
Un autre problème avec l'utilisation de ces bibliothèques est la gestion des événements. Le programme se fige lorsque vous maintenez la barre de titre pour un windowMove événement. Oh mon Dieu! L'utilisation de ces bibliothèques n'ont pas réellement d'une fenêtre de Déplacer l'événement.
Et pas de possibilités de modifier les événements étant tirée de sorte que vous pouvez définir vos propres événements et essentiel de décider quand arrêter et démarrer une boucle de jeu. Mes excuses pour quand j'ai dit que Open Gl je voulais dire Glut.h.
Dans summaey . Ces pas cher les bibliothèques semblent être un passe-temps uniquement endeaver et rien à mettre sur votre reaume , sauf si vous voulez donner à votre employeur de quelque chose de rigolo. Direct X, Open Gl, l'unreal engine sont le choix préféré des professionnels. Cependant j'ai l'intention de donner la SDL essayer.