#WM_centreBUTTONDOWN ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par Ollivier »

Crisot a écrit :
Ollivier a écrit : Le multi-tâche engendre des contraintes, notamment partager la main.
Les opérations GPU, un accès ram, disque, la synchro verticale (etc...) sont des moments où la main se rend naturellement. Au sein même du CPU certaines instructions chargeront plus ou moins le CPU. Au pire si notre application est extrêmement "CPU intensive" on baissera à peine la priorité de notre thread et on laissera l'Os faire. Bref, le multitasking, c'est son problème. :wink:
[/quote]Non!

Je tourne sur un engin qui fait 1/2 millions d'additions par secondes.

Si tu as renversé ton whisky à la lecture de ce 'prodigieux' record, j'en suis désolé!

Si mon jeu dépasse les 4% de ressources, je n'appelle plus ça un jeu, mais un troyen!

4% chez moi, ça doit être 0.2% chez toi.
Question: qu'est-ce que tu fais à 17% et plus?

Tu parles de conscience plus haut. Je te réponds non aussi! Je n'ai pas conscience. Tu mets un Delay(16) et pis c'est compris!

Les yeux c'est 30 images par secondes, ça fait des millions d'années!
1000 millisecondes / 30 = ça fait 33.
Donc si tu colles un Delay(33) ta boucle donne 100% aux autres tâches.

Delay(16), c'est une sécurité pour refiler grosso modo 50% de temps CPU aux autres tâches. C'est déjà bien lourd! Mais, là oui, ça donne conscience que tu symbolises une boucle principale en charge!

Mon résumé: ce n'est pas techniquement une remontrance qui remettrait en cause tes compétences. Si ça te semble le cas, explique-moi ça par mp (par petits messages sinon je ne peux pas tout lire, à cause de mon explorateur).

Certains de tes exemples sont tout simplement inexécutables chez moi (CPU à 1000% pour ceux-là), juste pour des défaut de delay()!

En gros, n'oublie pas que tu conduis un tank, pendant que d'autres conduisent une brouette!!!
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par falsam »

Je ne suis pas du tout convaincu par le passage obligé d'un delay() dans une application 2D.

J'ai aussi lu ce mémorable topic de 10 pages. Il y a de grands moments dans les répliques. J'ai adoré mais je ne suis toujours pas convaincu.
:arrow: http://www.purebasic.fr/french/viewtopic.php?f=1&t=9127

A lire avant de se coucher :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par Ollivier »

Yep mais le delay(1) ne pouvait être mesuré que par grains de 16ms!!!
Aujourd'hui, ce n'est plus le cas, le débat est donc éludé d'office!

Question de version: teste avec la 4.30 sur Windows, tu vas voir si je te raconte une bîtise.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par falsam »

Spock a écrit :ensuite met un delay(2) ou WaitWindowsEvent(2) et regarde la difference
Parfois il m'arrive d'obtenir une charge CPU plus importante que sans delay.

Voila un code qui va afficher progressivement 2000 sprites en mouvement.
Avec ou sans Delay() de 2 ms, la charge CPU est équivalente.

Code : Tout sélectionner

Enumeration Font
  #FontSprite
EndEnumeration

Enumeration Window
  #mainform
EndEnumeration

Enumeration Sprite
  #CpuUsage
EndEnumeration

Declare.d GetProcessCpuLoad (pid)
Declare RandomSign()

Define.i PID = GetCurrentProcessId_() ;Identification de notre application
Define.d CpuUsage, CpuUsageMin, CpuUsageMax
Define.i Radius
Structure NewSprite
  id.i
  x.i
  y.i
  sens.i
EndStructure

NewList Sprites.NewSprite()

;Initialisation
InitSprite() : InitKeyboard() : InitMouse()

;Font
LoadFont(#FontSprite, "Courrier", 15)

;Ouverture de la fenetre de l'application
OpenWindow(#mainform, 0, 0, 800, 600, "Test charge CPU", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

;Un timer pour traiter la charge CPU
AddWindowTimer(#mainform, 1, 500)

;Fenetre du rendu de la scene
OpenWindowedScreen(WindowID(#mainform), 0, 0, 800, 600)

;Un sprite qui affichera la charge CPU
CreateSprite(#CpuUsage, 800, 35, #PB_Sprite_AlphaBlending)

;Boucle evenementielle
Repeat  ;Evenement window  
  Repeat;Evenement screen
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_Timer
        ;CpuUsage = "Charge CPU " + StrD(GetProcessCpuLoad(PID),2) + "%"
        CpuUsage = GetProcessCpuLoad(PID)   
        
        If CpuUsage > CpuUsageMax
          CpuUsageMax = CpuUsage
        EndIf
        If CpuUsage < CpuUsageMin Or CpuUsageMin = 0 
          CpuUsageMin = CpuUsage
        EndIf
        
      Case #PB_Event_CloseWindow
        End
        
    EndSelect  
  Until Event=0
  
  ;Mise à jour de la charge Cpu dans un sprite
  StartDrawing(SpriteOutput(#CpuUsage))
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, 800, 35, RGBA(0, 0, 0, 128))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(#FontSprite))
  
  DrawText(5, 5, "Charge CPU " + StrD(CpuUsage, 2) + "%")
  DrawText(300, 5, "Min " + StrD(CpuUsageMin, 2) + "%")
  DrawText(450, 5, "Max " + StrD(CpuUsageMax, 2) + "%")
  DrawText(650, 5, "Sprites " + Str(ListSize(Sprites())))
  StopDrawing()
  
  ;Affichage de la charge CPU (Header)
  DisplayTransparentSprite(#CpuUsage, 0, 0)
  
  ;On va faire travailler un peu le CPU
  If ListSize(Sprites()) <> 2000
    AddElement(Sprites())
    With Sprites()
      \id = CreateSprite(#PB_Any, 100, 100, #PB_Sprite_AlphaBlending)
      \x = Random(700, 0)
      \y = Random(500, 100)
      \sens = RandomSign()
      
      StartDrawing(SpriteOutput(\id))
      DrawingMode(8)
      Box(0,0,100,100,RGBA(0,0,0,0))
      DrawingMode(16)
      Radius = Random(15, 5)
      Circle(50,50, Radius * 2,RGBA(255,255,255,80))
      Circle(50,50, Radius,RGBA(255,255,255,255))      
      StopDrawing()
    EndWith    
  EndIf
  
  ForEach Sprites()
    With Sprites()
      \x + \sens
      \y + \sens
      If \x < 0 Or \x > 700 Or \y < 100 Or \y > 500
        \sens * -1
      EndIf      
      DisplayTransparentSprite(\id, \x, \y)     
    EndWith
  Next
  
  FlipBuffers()
  ClearScreen(RGB(135, 206, 235))
  ExamineKeyboard()
  
  ;Delay ou pas delay
  Delay(2)
  
Until KeyboardPushed(#PB_Key_Escape)

Procedure.d GetProcessCpuLoad (pid)
  Static LastProcessTime.l = 0
  Static LastSystemTime.l = 0
  Static dCpuUsage.d
  
  Protected iCores =  CountCPUs(#PB_System_CPUs)
  Protected hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION,#False,pid)
  
  If (hProcess)
    Protected CurrentProcessTime.l, CurrentSystemTime.l
    Protected ftCreationTime.FILETIME , ftExitTime.FILETIME , ftKernelTime.FILETIME , ftUserTime.FILETIME
    Protected KernelTime.ULARGE_INTEGER , UserTime.ULARGE_INTEGER
    
    If GetProcessTimes_(hProcess, @ftCreationTime, @ftExitTime, @ftKernelTime, @ftUserTime)   
      KernelTime\HighPart = ftKernelTime\dwHighDateTime
      KernelTime\LowPart = ftKernelTime\dwLowDateTime
      UserTime\HighPart = ftUserTime\dwHighDateTime
      UserTime\LowPart = ftUserTime\dwLowDateTime
      
      CurrentProcessTime = (PeekQ(@KernelTime) + PeekQ(@UserTime)) / (iCores * 100)
      CurrentSystemTime = GetTickCount_() ; use GetTickCount64() if needed
      
      If(LastSystemTime)
        dCpuUsage = (CurrentProcessTime - LastProcessTime + 0.0) / (CurrentSystemTime - LastSystemTime)
        If CurrentSystemTime - LastSystemTime > 3000 ; smoothing 
          LastSystemTime = 0
          LastProcessTime = 0
        EndIf
      Else
        LastProcessTime = CurrentProcessTime
        LastSystemTime = CurrentSystemTime
      EndIf
    EndIf   
    
    CloseHandle_(hProcess)
    
    ProcedureReturn dCpuUsage
  EndIf
  
  ProcedureReturn -1 ; wrong PID
EndProcedure

Procedure RandomSign()
  ProcedureReturn Random(1)*2-1
EndProcedure
Si on augmente le Delay() le temps d'éxécution augmente et on perd en fluidité.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: #WM_centreBUTTONDOWN ?

Message par SPH »

Je trouve tout a fait normal que le CPU soit en charge quand on joue a un jeu video.
Quand on joue, on s'attend bien a ce que l'ordi donne tout ce qu'il a !

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: #WM_centreBUTTONDOWN ?

Message par crisot »

Je ne répondrais qu'à ça.
Ollivier a écrit :
Les yeux c'est 30 images par secondes, ça fait des millions d'années!
C'est un mythe. Montres à n'importe quel oeil exercé des softs fonctionnant à 30 ou 60 fps, le gars te donnera obligatoirement le bon résultat.



Pour le reste les gars je suis désolé, ce débat ne m'intéresse pas. On ne met pas de delay() dans un code. Point.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: #WM_centreBUTTONDOWN ?

Message par SPH »

Spock a écrit :mais, sinon , tu as parfaitement raison, tu fais bien comme tu le sent :)
En l'occurence, on parle d'une routine qui se retrouve dans mon jeu. Et je fais totalement confiance a Crisot car il programme depuis longtemps. De plus, forcer une routine a ralentir avec un delay, ca me semble pas naturel 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par falsam »

Spock a écrit :deja , je me demande ce que mesure ta procedure ...
Houuuuuu le vilain !!! Je mesure la charge CPU pour le processus en cours.

Tu l'auras surement remarqué, j'utilise l'API GetProcessTimes_() pour demander les informations d'horloge pour le processus spécifié c'est à dire ici, l'application en cours d'éxécution.

J'utilise un timeout de 500ms ce qui peut expliquer la différence d'affichage à un instant T entre mon code et le gestionnaire de tache.

La charge CPU stabilisé avec Delay() ou sans Delay() et chez toi à peine de 2% ce qui laisse supposer que tu as un i7 de course et une trés bonne carte vidéo.

J'ai pratiqué ce test sur un modeste i3 et une petite carte vidéo et je n'ai meme pas 1% d'écart avec ou sans Delay(). Comme quoi ce n'est pas la solution miracle.

Je rejoint Crisot : Pas de Delay() dans mes codes. :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par Ollivier »

Crisot a écrit :Pour le reste les gars je suis désolé, ce débat ne m'intéresse pas. On ne met pas de delay() dans un code. Point.
T'as raison! Mais, c'est aussi parce qu'il est inclu dans le code d'office, qu'il n'y a pas de débat. Fred a été fourguer un Delay(4) dans le FlipBuffers() !!!

La fermeté a du bon!
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: #WM_centreBUTTONDOWN ?

Message par SPH »

Ollivier a écrit :Fred a été fourguer un Delay(4) dans le FlipBuffers() !!!
Si il a mis un delay(4) dans le flipbuffer, on a donc pas a en rajouter... :twisted:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: #WM_centreBUTTONDOWN ?

Message par crisot »

Ollivier a écrit : Je tourne sur un engin qui fait 1/2 millions d'additions par secondes.
Tiens, 0.5 MIPS, c'est pas un 68000 à 7 Mhz ton engin? :D
SPH a écrit :Si il a mis un delay(4) dans le flipbuffer, on a donc pas a en rajouter... :twisted:
Je dirais même qu'il ne faut surtout plus utiliser FlipBuffers()... :mrgreen:
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: #WM_centreBUTTONDOWN ?

Message par SPH »

crisot a écrit :'il ne faut surtout plus utiliser FlipBuffers()... :mrgreen:
Au profit de quel bout de code :?: :P

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par falsam »

crisot a écrit :Je dirais même qu'il ne faut surtout plus utiliser FlipBuffers()
Essayes ce code en commentant FlipBuffers() et tu vas voir le résultat aprés quelques secondes.

Essayes de déplacer la fenetre par exemple.

Esc: Abandon ... si c'est encore possible
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par Ollivier »

@Falsam

C'est une boutade de Crisot pour se foot de ma grande Gée!

Code : Tout sélectionner

Repeat

Repeat
Ev = WindowEvent()
If Ev
Delay(16)
; Traitement évènement
Endif
Until Not Ev

Until Quit
@Crisot

Et celui-là, tu es quand même obligé de le fourguer, sinon tu ne peux plus voir une animation sans bouger les souris...

MAIS, tu as raison: ça, ce n'est déjà plus considéré comme une partie directe de la boucle principale.

(Edité) Ce delay-là aussi peut être remplacé par un WaitWindowEvent(Timer) !
Dernière modification par Ollivier le sam. 05/sept./2015 11:32, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: #WM_centreBUTTONDOWN ?

Message par falsam »

Ollivier a écrit :C'est une boutade de Crisot pour se foot de ma grande Gée!
Je me méfie de Crisot. Depuis sa chute avec sa bécane et le fait qu'il côtoie SPH, je me demande si il a bien encore toute ça tête. Peut être même qu'il se torchonne serviette le soir en buvant du thé southpark.
Spock a écrit :@falsam : je me demandais si ton Case #PB_Event_Timer n'intervenait pas dans une certaine mesure comme un delay() ..
ça c'est bien possible :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre