StartDrawing très très très très lent PB6.30b6

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2716
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

StartDrawing très très très très lent PB6.30b6

Message par Thyphoon »

Je viens de remarquer quelques choses ... avec un écran en 4K un simple startdrawing(screenoutput()) et le nombre de FPS s'écroule totalement ... on passe de 60FPS a 30FPS juste en affichant le texte en appuyant sur F2 ... c'est normal ? je veux bien que StrartDrawing soit couteux, mais a ce point là ! Et même dans des affichages plus complexe on passe de 60 a 30 FPS.
Machine de test : i7-8700 Ram32GO et Nvidia GTX 1080 !
Quelqu'un peu confirmer ? je me demande si il n'y a pas un bug...😅
C'est avec la version de Purebasic 6.30 beta 6

Code : Tout sélectionner


EnableExplicit

#SpriteID = 0
#SpriteSize = 32

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Erreur", "InitSprite() ou InitKeyboard() a échoué.")
  End
EndIf

; Récupération résolution écran (desktop 0)
ExamineDesktops()
Define.i screenW = DesktopWidth(0)
Define.i screenH = DesktopHeight(0)

If screenW <= 0 Or screenH <= 0
  MessageRequester("Erreur", "Impossible de lire la résolution du bureau.")
  End
EndIf

; Ouvrir l'écran à la résolution native
; Note: en fullscreen, pas de barre/menus, et Escape pour quitter.
If OpenScreen(screenW, screenH, 32, "Sprite rebond + FPS (F2)") = 0
  MessageRequester("Erreur", "OpenScreen() a échoué.")
  End
EndIf

; Création du sprite (carré blanc)
If CreateSprite(#SpriteID, #SpriteSize, #SpriteSize, #PB_Sprite_AlphaBlending) = 0
  MessageRequester("Erreur", "CreateSprite() a échoué.")
  End
EndIf

If StartDrawing(SpriteOutput(#SpriteID))
  Box(0, 0, #SpriteSize, #SpriteSize, RGB(255, 255, 255))
  StopDrawing()
EndIf

; Position / vitesse
Define.f x = (screenW - #SpriteSize) * 0.5
Define.f y = (screenH - #SpriteSize) * 0.5
Define.f vx = 6.0
Define.f vy = 4.0

; FPS
Define showFPS.i = #False
Define frames.i = 0
Define fps.i = 0
Define lastFpsTick.i = ElapsedMilliseconds()

; Gestion toggle F2 (anti-répétition)
Define f2WasDown.i = #False

Repeat
  ExamineKeyboard()

  If KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf

  ; Toggle F2 (une fois par appui)
  If KeyboardPushed(#PB_Key_F2)
    If f2WasDown = #False
      showFPS ! 1
      f2WasDown = #True
    EndIf
  Else
    f2WasDown = #False
  EndIf

  ; Mouvement
  x + vx
  y + vy

  ; Rebond X
  If x < 0
    x = 0
    vx = -vx
  ElseIf x + #SpriteSize > screenW
    x = screenW - #SpriteSize
    vx = -vx
  EndIf

  ; Rebond Y
  If y < 0
    y = 0
    vy = -vy
  ElseIf y + #SpriteSize > screenH
    y = screenH - #SpriteSize
    vy = -vy
  EndIf

  ; Rendu
  ClearScreen(RGB(0, 0, 0))
  DisplaySprite(#SpriteID, Int(x), Int(y))

  ; Calcul FPS (mise à jour 1 fois / seconde)
  frames + 1
  If ElapsedMilliseconds() - lastFpsTick >= 1000
    Debug fps
    fps = frames
    frames = 0
    lastFpsTick = ElapsedMilliseconds()
  EndIf

  ; Affichage FPS
  If showFPS
    If StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(10, 10, "FPS : " + Str(fps), RGB(255, 255, 255))
      StopDrawing()
    EndIf
  EndIf

  FlipBuffers()

ForEver

End


G-Rom
Messages : 3645
Inscription : dim. 10/janv./2010 5:29

Re: StartDrawing très très très très lent PB6.30b6

Message par G-Rom »

Salut Typhoon, DrawText a toujours été lent.
passe par un sprite, une fois par seconde :

Code : Tout sélectionner

EnableExplicit

#SpriteID = 0
#SpriteID2 = 1
#SpriteSize = 32

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Erreur", "InitSprite() ou InitKeyboard() a échoué.")
  End
EndIf

; Récupération résolution écran (desktop 0)
ExamineDesktops()
Define.i screenW = DesktopWidth(0)
Define.i screenH = DesktopHeight(0)

If screenW <= 0 Or screenH <= 0
  MessageRequester("Erreur", "Impossible de lire la résolution du bureau.")
  End
EndIf

; Ouvrir l'écran à la résolution native
; Note: en fullscreen, pas de barre/menus, et Escape pour quitter.
If OpenScreen(screenW, screenH, 32, "Sprite rebond + FPS (F2)") = 0
  MessageRequester("Erreur", "OpenScreen() a échoué.")
  End
EndIf

; Création du sprite (carré blanc)
If CreateSprite(#SpriteID, #SpriteSize, #SpriteSize, #PB_Sprite_AlphaBlending) = 0
  MessageRequester("Erreur", "CreateSprite() a échoué.")
  End
EndIf

If CreateSprite(#SpriteID2, 256, 64, #PB_Sprite_AlphaBlending) = 0
  MessageRequester("Erreur", "CreateSprite() a échoué.")
  End
EndIf



If StartDrawing(SpriteOutput(#SpriteID))
  Box(0, 0, #SpriteSize, #SpriteSize, RGB(255, 255, 255))
  StopDrawing()
EndIf

; Position / vitesse
Define.f x = (screenW - #SpriteSize) * 0.5
Define.f y = (screenH - #SpriteSize) * 0.5
Define.f vx = 6.0
Define.f vy = 4.0

; FPS
Define showFPS.i = #False
Define frames.i = 0
Define fps.i = 0
Define lastFpsTick.i = ElapsedMilliseconds()

; Gestion toggle F2 (anti-répétition)
Define f2WasDown.i = #False

Repeat
  ExamineKeyboard()

  If KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf

  ; Toggle F2 (une fois par appui)
  If KeyboardPushed(#PB_Key_F2)
    If f2WasDown = #False
      showFPS ! 1
      f2WasDown = #True
    EndIf
  Else
    f2WasDown = #False
  EndIf

  ; Mouvement
  x + vx
  y + vy

  ; Rebond X
  If x < 0
    x = 0
    vx = -vx
  ElseIf x + #SpriteSize > screenW
    x = screenW - #SpriteSize
    vx = -vx
  EndIf

  ; Rebond Y
  If y < 0
    y = 0
    vy = -vy
  ElseIf y + #SpriteSize > screenH
    y = screenH - #SpriteSize
    vy = -vy
  EndIf

  ; Rendu
  ClearScreen(RGB(0, 0, 0))
  DisplaySprite(#SpriteID, Int(x), Int(y))

  ; Calcul FPS (mise à jour 1 fois / seconde)
  frames + 1
  If ElapsedMilliseconds() - lastFpsTick >= 1000
    Debug fps
    fps = frames
    frames = 0
    lastFpsTick = ElapsedMilliseconds()
  
  
    ; Affichage FPS
    If showFPS
      If StartDrawing(SpriteOutput(#SpriteID2))
        DrawingMode(#PB_2DDrawing_Transparent)
        Box(0,0,256,64,0)
        DrawText(10, 10, "FPS : " + Str(fps), RGB(255, 255, 255))
        StopDrawing()
      EndIf
    EndIf
  EndIf
  
  DisplaySprite(#SpriteID2,0,0)

  FlipBuffers()

ForEver

End

j'ai voulu viré la syncro pour voir les fps, je suis a + de 6000 frames par seconde, et je vois 50000 balles... (AMD Ryzen 9 9950X 16-Core Processor , 96,0 Go de ram & rtx5090ti)
j'ai gardé ton code & je suis passé par un sprite standard , tu devrais etre à 60 fps.
ceux qui ont des écrans a 90 ou + de refresh rate , cela va aller plus vite.
recherche deltatime sur le forum, tu devrais trouvé des résultats pertinents.
Avatar de l’utilisateur
Thyphoon
Messages : 2716
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: StartDrawing très très très très lent PB6.30b6

Message par Thyphoon »

Merci beaucoup !
En fait j'utilise de puis des années.. Startdrawing() drawtext() surtout pour afficher des infos de debuggage, mais je métais jamais rendu compte que le startdrawing() était si couteux ... 😅😅😅c'était aussi couteux ! Merci pour le conseille 😅 et surtout merci d'avoir regardé !
Répondre