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 8)

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)

:wink:

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é.