Page 1 sur 2
Attention à WindowEvent
Publié : dim. 21/juin/2015 12:19
par microdevweb
Bonjour à tous,
Lorsque l'on développe un jeux par exemple, on évite le WaitWindowEvent() qui bloque la boucle jusqu'au retour d'un événement Window
Comme ceci avec 2 boucles imbriquées
Code : Tout sélectionner
OpenWindow(0,0,0,800,600,"tetes",#PB_Window_SystemMenu)
Repeat
Repeat
Event=WindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until Event=0
;Traitement du jeux
ForEver
Si vous lancez ce code (qui ne fait absolument rien) et que vous ouvrer (CTRL+ALT+Delete) votre gestionnaire de tache (window) aller sur l'onglet Processus et chercher Purebasic_compilation.... vous verrez que dans "Processeur" votre processeur est occupé (chez moi du moins) à 25%.
Modifier le code comme suit
Code : Tout sélectionner
OpenWindow(0,0,0,800,600,"tetes",#PB_Window_SystemMenu)
Repeat
Delay(1)
Repeat
Event=WindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until Event=0
;Traitement du jeux
ForEver
La vous verrez le processeur à 0%, je suis certain que beaucoup de personnes le savent, et je ne veux pas me faire plus malin que je ne le suis. Mais voila bon à savoir.
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 12:44
par falsam
microdevweb a écrit :on évite le WaitWindowEvent()
Dans WaitWindowEvent il y a ..... attention suspense ......
wait
Quand à ton delay je ne suis pas certain de son utilité
Ce code plus complet occupe 0.1% (parfois 0.2%) de mon processeur.
Code : Tout sélectionner
;Initialisation
If InitSprite()
InitKeyboard()
InitMouse()
EndIf
;Creation du screen
OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;Boucle evenementielle
Repeat ;Evenement window
Repeat ;Evenement screen
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event=0
FlipBuffers()
ClearScreen(RGB(135, 206, 235))
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 12:45
par Marc56
La démo est parlante effectivement (26% chez moi) contre 0.15% pour Delay(1), cela dit, Fred l'avait déjà prévu
WindowEvent()
[...]
« Cette commande doit être utilisée avec précaution, car comme elle n'est pas bloquante, elle peut consommer tout le temps processeur quand elle est dans une boucle d'attente. Dans un tel cas, utiliser la commande Delay() quelque part dans la boucle ou mieux, il est préférable d'utiliser la commande WaitWindowEvent() avec une petite valeur de minuteur (timeout). »
[...]
PS. Pour bien voir ce qu'utilise le système et plus détaillé que le gestionnaire de tâches:
ProcessExplorer
(Fait partie des
Sysinternals Suite de Mark Russinovich, maintenant racheté par Microsoft et mis à disposition gratuitement)

Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 12:50
par microdevweb
@falsam, dans le cadre de mon projet, j'ai du mettre Delay(10)... Mais je n'avais pas pensé avec WaitWindowEvent avec une valeur... Je teste
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 12:54
par falsam
WaitWindowEvent() pour un jeu il faut juste oublier !!
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 12:58
par microdevweb
Je confirme que je penses qu'il est préférable d'utilisé le WaitWindowEvent(1)
Code : Tout sélectionner
OpenWindow(0,0,0,800,600,"tetes",#PB_Window_SystemMenu)
Repeat
Event=WaitWindowEvent(1)
If Event=#PB_Event_CloseWindow
End
EndIf
;Traitement du jeux
ForEver
Bhen voila on en apprend tous les jours...
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 13:01
par falsam
microdevweb a écrit :Lorsque l'on développe un jeux par exemple,
Ton sujet de départ portant sur les jeux, WaitWindowEvent() est à proscrire.
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 13:09
par microdevweb
Humm, la ce n'est pas un jeux, mais dans ma boucle j’anime des images (dans un canvas) et ça à l'air d'être plus ou moins fluide. (ps: j'ai modifier mes deux boucles imbriquée comme suit)
Code : Tout sélectionner
Repeat
; Delay(10)
; Repeat
gEvent=WaitWindowEvent(1)
; Until gEvent=0
Select gPreviewMode
Case #Pre_None
PreviewNone()
Case #Pre_Image
PreviewImage()
Case #Pre_Sprite
PreviewImage()
Case #Pre_Animation
PreviewAnimation()
Case #Pre_Create
PreviewCreate()
EndSelect
Until gExit=#True
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 13:34
par microdevweb
@Falsam,
Petite question, je fait un visuel d'animation dans un canvas 4 frames, processeur en 12 et 13% (mem 71268 k), c'est beaucoup ou pas?
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 14:20
par falsam
Le canvasgadget n'est pas forcément l'idéal pour les jeux.
J'ai fait l'expérience en 2012 en codant un jeu sur un support CanvasGadget.
24% Procésseur et 9,4Mo d'occupation mémoire.
http://www.purebasic.fr/french/viewtopi ... lit=kanoid
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 14:32
par blendman
falsam a écrit :Ce code plus complet occupe 0.1% (parfois 0.2%) de mon processeur
Pour une application graphique utilisant le screen (mais pas examinemouse(), c'est mieux waitwindowevent(1) ou ton exemple ?
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 14:48
par microdevweb
Peut'être un OpenGL gadget...
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 15:59
par falsam
microdevweb a écrit :Pour une application graphique utilisant le screen (mais pas examinemouse(), c'est mieux waitwindowevent(1) ou ton exemple ?
J'ai dit une connerie dans mes propos précédents ?
falsam a écrit :WaitWindowEvent() pour un jeu il faut juste oublier !!
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 16:13
par falsam
En fait non je ne pense pas avoir dit une bétise.
Petite balle rebondissante à tester.
Code : Tout sélectionner
EnableExplicit
;Quelques variables
Global Event
Global Image, Ground
Global Ball, BallX = 400, BallY = 200, BallVelocityY.f = 5,BallGravityY.f = 2
;Initialisation diverses
If InitSprite()
InitKeyboard()
InitMouse()
EndIf
UsePNGImageDecoder()
UsePNGImageEncoder()
;Creation du screen
OpenWindow(0, 0, 0, 800, 600, "Ca ne sert à rien", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;Création et sauvegarde de l'image de référence pour la création des autres sprites
;Cette image est sauvegardée au format PNG afin de gérér la transparence.
Image = CreateImage(#PB_Any, 8, 8, 24, RGB(255, 255, 255))
SaveImage(Image, "WhiteSquare.png", #PB_ImagePlugin_PNG)
;Creation du sol
Ground = LoadSprite(#PB_Any, "WhiteSquare.png")
ZoomSprite(Ground, 800, 32)
;Creation de la ball
Ball = LoadSprite(#PB_Any, "WhiteSquare.png")
ZoomSprite(Ball, 16, 16)
;Boucle evenementielle
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event=0
FlipBuffers()
ClearScreen(RGB(135, 206, 235))
;Evenement clavier
ExamineKeyboard()
;Affichage du sol
DisplaySprite(Ground, 0, 570)
;Affichage de la balle
DisplaySprite(Ball, BallX, BallY)
;La balle est en mouvement
BallVelocityY + BallGravityY
BallY + BallVelocityY
If SpriteCollision(Ball, BallX, BallY+10, Ground, 0, 570)
BallY= 554
BallVelocityY * -1
EndIf
Until KeyboardPushed(#PB_Key_Escape)
Remplacer WindowEvent() par WaitWindowEvent() le jeu sera bloqué.
Re: Attention à WindowEvent
Publié : dim. 21/juin/2015 16:13
par falsam
En fait non je ne pense pas avoir dit une bétise.
Petite balle rebondissante à tester.
Code : Tout sélectionner
EnableExplicit
;Quelques variables
Global Event
Global Image, Ground
Global Ball, BallX = 400, BallY = 200, BallVelocityY.f = 5,BallGravityY.f = 2
;Initialisation diverses
If InitSprite()
InitKeyboard()
InitMouse()
EndIf
UsePNGImageDecoder()
UsePNGImageEncoder()
;Creation du screen
OpenWindow(0, 0, 0, 800, 600, "Ca ne sert à rien", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
;Création et sauvegarde de l'image de référence pour la création des autres sprites
;Cette image est sauvegardée au format PNG afin de gérér la transparence.
Image = CreateImage(#PB_Any, 8, 8, 24, RGB(255, 255, 255))
SaveImage(Image, "WhiteSquare.png", #PB_ImagePlugin_PNG)
;Creation du sol
Ground = LoadSprite(#PB_Any, "WhiteSquare.png")
ZoomSprite(Ground, 800, 32)
;Creation de la ball
Ball = LoadSprite(#PB_Any, "WhiteSquare.png")
ZoomSprite(Ball, 16, 16)
;Boucle evenementielle
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event=0
FlipBuffers()
ClearScreen(RGB(135, 206, 235))
;Evenement clavier
ExamineKeyboard()
;Affichage du sol
DisplaySprite(Ground, 0, 570)
;Affichage de la balle
DisplaySprite(Ball, BallX, BallY)
;La balle est en mouvement
BallVelocityY + BallGravityY
BallY + BallVelocityY
If SpriteCollision(Ball, BallX, BallY+10, Ground, 0, 570)
BallY= 554
BallVelocityY * -1
EndIf
Until KeyboardPushed(#PB_Key_Escape)
Remplacer WindowEvent() par WaitWindowEvent() le jeu sera bloqué.