Attention à WindowEvent

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Attention à WindowEvent

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Attention à WindowEvent

Message 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:
Dernière modification par Marc56 le dim. 21/juin/2015 12:59, modifié 1 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Attention à WindowEvent

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message par falsam »

WaitWindowEvent() pour un jeu il faut juste oublier !!
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Attention à WindowEvent

Message 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...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Attention à WindowEvent

Message 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    
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Attention à WindowEvent

Message 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?
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Attention à WindowEvent

Message 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 ?
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Attention à WindowEvent

Message par microdevweb »

Peut'être un OpenGL gadget...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message 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 !!
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message 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é.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Attention à WindowEvent

Message 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é.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre