1

Bonjour.
Je voulais savoir (en C, ou éventuellement en C++) s'il était possible de libérer le CPU pour laisser à Windows gérer les autres tâches (déjà qu'il peine pas mal sur les PC puissants...) et ainsi pouvoir lancer plusieurs fois l'appli en même temps sans que ça bourre trop...
Apparemment, Snes9x fait ça, il me semble. J'aimerais permettre d'utiliser cette option, même s'il faudra que l'utilisateur désactive la VSync et utilise le blit GDI à ce moment-là. Ce n'est pas un problème.
Etant donné qu'il s'agit d'une lib 2D, elle pourrait être servie pour des jeux, mais aussi pour de plus petites applis graphiques, comme un visionneur de texte par exemple (j'en ai pas d'autre) et cette option me semble indispensable (on veut facilement en lancer plusieurs en même temps)...
Merci d'avance.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

2

sleep(0);
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3

Malheureusement, ça ne suffit pas. Sleep(0) stoppe l'exécution du thread courant et laisse la main au prochain dans la liste. Mais bien entendu, une fois l'exécution des autres terminée, il va y revenir directement (sans pause) et ça ne libère (apparemment) pas le CPU...
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

4

exit(0) alors.. c'est bien pour libérer du CPU. grin
So much code to write, so little time.

5

Brunni
: Malheureusement, ça ne suffit pas. Sleep(0) stoppe l'exécution du thread courant et laisse la main au prochain dans la liste. Mais bien entendu, une fois l'exécution des autres terminée, il va y revenir directement (sans pause) et ça ne libère (apparemment) pas le CPU...
gni ? Je comprends pas le pb là ? Libérer le CPU, c bien ce sleep(0) fait ^^
Si ce n'est pas efficace, c'est que tu ne l'utilises pas correctement.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

6

Ben voilà ce que j'utilise pour le moment:
ticks = (__int64)temps * freq / 1000;
while((courant - dernier) < ticks)
  QueryPerformanceCounter((LARGE_INTEGER*)&courant);
dernier+=ticks;
Ca fonctionne bien, mais le seul hic, c'est que mon CPU travaille à 100% (et il chauffe cheeky) et insérer un Sleep(0) dans la boucle ne change rien. Insérer un Sleep(1) fait bien descendre la consommation, sauf qu'il s'agit en fait d'un minimum de ~16 ms sur Win NT/2k/XP et ~55 ms sur Win9x. Alors forcément mon animation rame, le frameskip est quasi toujours activé et ça saccade inutilement. J'ai essayé avec pas mal d'autres fonctions Windows (WaitForMultipleObjects ou un truc du genre) mais on est toujours limité à cette fréquence.
Alors mon problème: y'aurait-il un timer plus adapté et plus rapide sur lequel on puisse compter pour "endormir" l'application un faible instant et consommer moins de CPU?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

7

*hem* Je suppose que ça ne t'es même pas venu à l'idée d'utiliser sleep((int)(temps * freq / 1000)) ?
Ensuite, en ce qui concerne l'innefficaité de sleep(0), je voudrais bien voir ça... Tu ne le mets peut-être pas au bon endroit.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

8

Ensuite, en ce qui concerne l'innefficaité de sleep(0), je voudrais bien voir ça... Tu ne le mets peut-être pas au bon endroit.
Ecoute, je te dis que la résolution du timer de Sleep est bien trop faible pour cette utilisation. Essaie avant d'affirmer.
Sleep(0);Par exemple:while(1) Donne une utilisation de 100% du CPU dans le gestionnaire des tâches.
Comme je te l'ai dit (et comme c'est écrit dans la doc) Sleep(0) ne fait que donner la main à la prochaine tâche dans la liste, mais ne résoud pas mon problème.
*hem* Je suppose que ça ne t'es même pas venu à l'idée d'utiliser sleep((int)(temps * freq / 1000)) ?
Bien sûr. De toutes manières la résolution du timer est de 16 ms. Tu peux bien demander une attente de 1 ms, elle sera de toutes manières entre 0 et 16 ms... neutral
C'est comme si tu fais OSRegisterTimer et que tu attends OSTimerExpired avec la fréquence par défaut de 20 Hz, tu ne vas pas pouvoir attendre moins que 50 millisecondes...
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

9

Bah écoute, t'as qu'a utiliser Sleep(1) si tu veux sinon, mais si ton timing est pas assez précis, c ton problème après tongue
(D'autant plus que je vois pas ce que tu peux en avoir à fouttre que le CPU soit utilisé à 100% par ton programme vu que Sleep(0) permet aux autres de se partager le temps CPU)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

10

Essaye d'augmenter la priorité de ton processus, il est possible que ça te permette de réduire le délai de Sleep(1) (jamais essayé, mais ça serait pas impossible)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

11

Non, ça ne marchera pas, parce que ce délai est lié au règlage du timer par l'os. Si tu veux des timers plus fins sous windows, regarde les timers multimedias sur msdn.microsoft.com.

Si tu veux un truc portable, les timers sdl peuvent t'intéresser (enfin si c'est que pour les timers, c'est un peu lourd d'utiliser sdl).

12

Dans Windows, à appeler de temps en temps dans une longue boucle, ou à la fin d'un thread pour attendre l'appel suivant :
BOOL PeekAndPump()
{
static MSG msg;

while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return FALSE;
}
}

return TRUE; }


Ca libère la pression des messages en attente sur la pile... Pour Linux, je ne sait pas s'il à un équivalent !

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

13

Totalement Hors sujet neutral
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

14

oui je voulais pas le dire pour pas être méchant, mais maintenant que tu l'as dit, je pencil.