Page 1 sur 2

Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 17:03
par JohnJohnsonSHERMAN
Bonjour à tous !
Je me demande entre le canvas, la fenêtre, le screen et le screen fenêtré lequel est le plus rapide pour y dessiner ?

J'ai fait ce code, mais comme vous allez le constater, l'affichage du dégradé derriére le Sherman est trés saccadé.

Les fichiers se trouvent ici(code + Sherman + BASS)

Code : Tout sélectionner

IncludeFile "bass.pbi"
IncludeFile "bass2.pbi"

UsePNGImageDecoder()

Enumeration
  #Sherman
  #Fond
  #Window
EndEnumeration

Define File.s
Global streamID, width,height, ShermanX,ShermanY, FPScount,FPS

#width = 800
#height = 600

Declare TH_Background(param)

If CountProgramParameters() = 0
  File = OpenFileRequester("Choisissez un fichier à lire","","Musique|*.wav;*.mp3;*.ogg|Wave|*.wav|MP3|*.mp3",0)
Else
  File = ProgramParameter(0)
EndIf

LoadImage(#Sherman,"M4_Sherman_early_normandy.png")

ShermanX = (#width/2)-(ImageWidth(#Sherman)/2)
ShermanY = (#height/2)-(ImageHeight(#Sherman)/2)

OpenWindow(#Window, 0, 0, #width,#height,"Sherman - ",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CanvasGadget(#Fond,0,0,#width,#height)
AddWindowTimer(#Window,1,1000)

retval_init = BASS_Init(-1,48000,0,WindowID(#Window),0)
streamID = BASS_StreamCreateFile(#False,File,0,0,#BASS_UNICODE | #BASS_SAMPLE_FLOAT | #BASS_SAMPLE_LOOP)
BASS_ChannelPlay(streamID,0)

CreateThread(@TH_Background(),1)

;- Boucle principale

Repeat
  event = WaitWindowEvent()
  Select event
    Case #PB_Event_Timer
      If EventTimer()= 1
        FPS = FPScount
        FPScount= 0
      EndIf
  EndSelect
  
  
Until event = #PB_Event_CloseWindow

;-Procédures

Procedure TH_Background(param)
  Protected vol,volf.f,clr.i
  Repeat
    vol = BASS_ChannelGetLevel(streamID)
    vol = (vol & $FFFF)
    volf = (vol/32768)*255
    If clr = $FFFFFF
      clr = 0
    Else
      clr = $FFFFFF
    EndIf
    FPScount + 1
    
    StartDrawing(CanvasOutput(#Fond))
    Box(0,0,#width,#height,$000000)
    
    FrontColor($000000)
    BackColor(RGB(volf,volf,volf))
    DrawingMode(#PB_2DDrawing_Gradient)
    CircularGradient(#width/2,#height/2,500)
    Box(0,0,#width,#height,RGB(volf,volf,volf))
    DrawingMode(#PB_2DDrawing_Default)
    Box(0,0,10,10,clr)
    DrawText(11,0,Str(FPS))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(#Sherman),ShermanX, ShermanY)
    StopDrawing()
    Debug clr
    Delay(25)
  ForEver 
EndProcedure

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 17:17
par Ollivier
C'est le full screen le plus rapide.

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 17:22
par falsam
...

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 17:44
par falsam
J'ai testé ton code. C'est trés fluide. Pas une seule saccade.

A quoi sert Box(0,0,10,10,clr) ?

Pour ce type d'application le canvas est très bien.

Si c'est un jeu que tu souhaites faire alors oui le FullScreen sera le plus rapide.

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 17:58
par JohnJohnsonSHERMAN
Ah merde, le code n'était pas corrigé.... Bref maintenant ca y est, j'ai enlevé les chemins en dur.

Dis mois quelle valeur de fps tu as falsam (le petit chiffre en haut à gauche).

Le Box(0,0,10,10,clr) c'est un petit carré qui s'affiche toutes les deux frames pour voir la vitesse d'affichage. Chez moi j'ai 8 fps avec un canvas.

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:00
par falsam
JohnJohnsonSHERMAN a écrit :Dis mois quelle valeur de fps tu as falsam (le petit chiffre en haut à gauche).
22

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:04
par JohnJohnsonSHERMAN
le même mais sans chemin en dur... ca me piquait les yeux aussi

22 Fps?! Pas mal... moi j'en suis à 8... T'as quoi comme processeur?

Ah aussi, pense tu qu'avec un windowed screen je pourrais remonter autour de 20 fps sans enlever le dégradé?

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:11
par Ollivier
Falsam a écrit :Sort pas des trucs comme ça sans regardé le context du code.
Bonjour Falsam,

1) Prouve-le que je n'ai pas regardé le "contexte du code", cela m'intéresse.
2) S'il te plaît, t'est-il possible de faire moins de fautes?
Sors pas des trucs comme ça sans regarder le contexte du code.

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:12
par falsam
@Ollivier:
1) Prouve-le que je n'ai pas regardé le "contexte du code", cela m'intéresse.
Tu as répondu pour une fois avec une réponse tellement courte et compréhensive que je suis certain que tu n'as pas testé le zip de John.
2) S'il te plaît, t'est-il possible de faire moins de fautes?
Gna Gna Gna. C'est facile quand on manque de répondant ^^ En général je fais attention mais en ce moment je ne suis pas en forme.
JohnJohnsonSHERMAN a écrit :T'as quoi comme processeur?
Processeur i3 3Ghz 4 Go Ram

Supprime ton debug et le delay(25)

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:18
par JohnJohnsonSHERMAN
Même sans ca reste en dessous des 20fps avec un canvas... en bouffant le proco a cause de l'absence de delay...
C'est bizarre... je testerai sur mon PC avec un I4 demain, mais là je suis sur mon portable qui a un AMD A8.
Je retire le delay et je vous donne les fps

Edit : ca reste à 8 fps

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:22
par falsam
Essaye avec l'environnement 2D dans ce cas pour voir.

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:24
par JohnJohnsonSHERMAN
Je te tiens au courant, alors. Peut-être que la lib 2D Drawing n'est pas trés rapide pour les dégradés ?

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:33
par JohnJohnsonSHERMAN
Je passe à 25 fps, et le dégradé ne fonctionne plus, le Sherman n'est plus transparent non plus... :(

Voici le nouveau code :

Code : Tout sélectionner

IncludeFile "bass.pbi"
IncludeFile "bass2.pbi"

UsePNGImageDecoder()
InitSprite()

Enumeration
  #Sherman
  #Fond
  #Window
EndEnumeration

Define File.s
Global streamID, width,height, ShermanX,ShermanY, FPScount,FPS

#width = 800
#height = 600

Declare TH_Background(param)

If CountProgramParameters() = 0
  File = OpenFileRequester("Choisissez un fichier à lire","","Musique|*.wav;*.mp3;*.ogg|Wave|*.wav|MP3|*.mp3",0)
Else
  File = ProgramParameter(0)
EndIf

LoadImage(#Sherman,"M4_Sherman_early_normandy.png")

ShermanX = (#width/2)-(ImageWidth(#Sherman)/2)
ShermanY = (#height/2)-(ImageHeight(#Sherman)/2)

OpenWindow(#Window, 0, 0, #width,#height,"Sherman - ",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
;CanvasGadget(#Fond,0,0,#width,#height)
AddWindowTimer(#Window,1,1000)

retval_init = BASS_Init(-1,48000,0,WindowID(#Window),0)
streamID = BASS_StreamCreateFile(#False,File,0,0,#BASS_UNICODE | #BASS_SAMPLE_FLOAT | #BASS_SAMPLE_LOOP)
BASS_ChannelPlay(streamID,0)

CreateThread(@TH_Background(),1)

;- Boucle principale

Repeat
  event = WaitWindowEvent()
  Select event
    Case #PB_Event_Timer
      If EventTimer()= 1
        FPS = FPScount
        FPScount= 0
      EndIf
  EndSelect
  
Until event = #PB_Event_CloseWindow

;-Procédures

Procedure TH_Background(param)
  Protected vol,volf.f,clr.i
  OpenWindowedScreen(WindowID(#Window),0,0,800,600)
  Repeat
    vol = BASS_ChannelGetLevel(streamID)
    vol = (vol & $FFFF)
    volf = (vol/32768)*255
    If clr = $FFFFFF
      clr = 0
    Else
      clr = $FFFFFF
    EndIf
    FPScount + 1
    
    StartDrawing(ScreenOutput())
    Box(0,0,#width,#height,$000000)
    
    FrontColor($000000)
    BackColor(RGB(volf,volf,volf))
    DrawingMode(#PB_2DDrawing_Gradient)
    CircularGradient(#width/2,#height/2,500)
    Box(0,0,#width,#height,RGB(volf,volf,volf))
    DrawingMode(#PB_2DDrawing_Default)
    Box(0,0,10,16,clr)
    DrawText(11,0,Str(FPS),$000000,$FFFFFF)
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(#Sherman),ShermanX, ShermanY)
    StopDrawing()
    FlipBuffers()
    Delay(25)
  ForEver 
EndProcedure

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:47
par falsam
Essayes de cette maniere

Code : Tout sélectionner

IncludeFile "bass.pbi"
IncludeFile "bass2.pbi"

UsePNGImageDecoder()
InitSprite()
InitKeyboard()

Enumeration
  #Sherman
  #Fond
  #Window
EndEnumeration

Define File.s
Global streamID, width,height, ShermanX,ShermanY, FPScount,FPS 
Global starttime, time

#width = 800
#height = 600

Declare TH_Background()

If CountProgramParameters() = 0
  File = OpenFileRequester("Choisissez un fichier à lire","","Musique|*.wav;*.mp3;*.ogg|Wave|*.wav|MP3|*.mp3",0)
Else
  File = ProgramParameter(0)
EndIf

OpenWindow(#Window, 0, 0, #width,#height,"Sherman - ",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#Window), 0, 0, #width, #height)

LoadSprite(#Sherman, "M4_Sherman_early_normandy.png", #PB_Sprite_AlphaBlending)

retval_init = BASS_Init(-1,48000,0,WindowID(#Window),0)
streamID = BASS_StreamCreateFile(#False,File,0,0,#BASS_UNICODE | #BASS_SAMPLE_FLOAT | #BASS_SAMPLE_LOOP)
BASS_ChannelPlay(streamID,0)

;- Boucle principale
starttime=ElapsedMilliseconds()

Repeat   
  Repeat
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
  
  ClearScreen(RGB(0, 0, 0))
  TH_Background()
  ExamineKeyboard()
  
  FPScount + 1
  If time>1000
    FPS = FPScount
    FPScount=0
    starttime=ElapsedMilliseconds()
  EndIf

  FlipBuffers()
  time=ElapsedMilliseconds()-starttime
Until KeyboardPushed(#PB_Key_Escape)

;-Procédures

Procedure TH_Background()
  Protected vol,volf.f,clr.i
  vol = BASS_ChannelGetLevel(streamID)
  vol = (vol & $FFFF)
  volf = (vol/32768)*255
  If clr = $FFFFFF
    clr = 0
  Else
    clr = $FFFFFF
  EndIf
  
  StartDrawing(ScreenOutput())  
  FrontColor($000000)
  BackColor(RGB(volf,volf,volf))
  DrawingMode(#PB_2DDrawing_Gradient)
  CircularGradient(#width/2,#height/2,500)
  Box(0,0,#width,#height,RGB(volf,volf,volf))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0,0,10,16,clr)
  DrawText(11,0,Str(FPS),$000000,$FFFFFF)
  StopDrawing()
  
  DisplayTransparentSprite(#Sherman, (ScreenWidth() - SpriteWidth(#Sherman))/2, (ScreenHeight() - SpriteHeight(#Sherman))/2)  
EndProcedure
FPS : 68

Re: Surface de dessin la plus rapide?

Publié : sam. 01/oct./2016 18:55
par Zorro
Je me demande entre le canvas, la fenêtre, le screen et le screen fenêtré lequel est le plus rapide pour y dessiner ?
Ollivier a écrit :C'est le full screen le plus rapide.
falsam a écrit :Sors pas des trucs comme ça sans regarder le contexte du code.
ben Olivier a parfaitement répondu a la question !

la surface la plus rapide c'est bien le Full Screen !!
analyse de code ou pas, n'y changera rien ! :roll:

le FullScreen est géré par les cartes Graph !
directx ou openGl .... le canvas, n'est qu'un gadget , il ne beneficit pas de l’accélération materiel
voir pire, il depend carrement du bon vouloir des events windows ....

donc , Olivier a carrement raison , il n'y a pas a tortiller ....

apres que le code de Sherman, soit naze , c'est possible, mais il n'empeche que la reponse a la question
est parfaitement juste


@sherman
apres avoir vite fait regardé le code , sans le tester

je vois que tu utilises un delay et un thread .....meme un timer au debut

mais pourquoi faire ??

en matière de code type "demo" , il faut rester super simple
pas de timer ou le moins possible , pas de thread .... réserve les threads pour des opérations de calcul ou de chargement
sinon franchement ça n'a pas lieu d'etre dans le cadre d'un code type 'demo'

et le delay() c'est un truc a n'utiliser qu'en de rare cas ... (boucle principale pour relacher les event )
mais franchement si ont peut eviter,..... :)

il existe WaitWindowEvent(Delay) qui est preferable ...