Scrolling fluide et ScrollAreaGadget >pb de rafraichissem

Sujets variés concernant le développement en PureBasic
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Scrolling fluide et ScrollAreaGadget >pb de rafraichissem

Message par Dräc »

Bon, si je reprends le meme exemple que dans le passé (que voulez vous c'est comme cela :wink: ):

Code : Tout sélectionner

InitSprite() 

Procedure WindowCallback(WindowID, Message, wParam, lParam) 
Result = #PB_ProcessPureBasicEvents;Result= DefWindowProc_(WindowID, Message, wParam, lParam) 

;Debug Str(message)+" / "+Str(#WM_VSCROLL) 
    Select Message 
      Case #WM_VSCROLL; Gestion de la barre verticale 
        Debug "#WM_VSCROLL" 
        Debug WindowID 
    EndSelect 

ProcedureReturn Result 
EndProcedure 

If OpenWindow(0,0,0,400,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget,"Window") 
  SetWindowCallback(@WindowCallback()) 
  If CreateGadgetList(WindowID(0)) 

    ScrollAreaGadget (1,10,10,200,200,500,400,10) 
    hCont = ContainerGadget(2,10,10,500,400,#PB_Container_Double) 
    CloseGadgetList() 

    If OpenWindowedScreen( hCont, 0, 0, 500, 400, 0, 0, 0 ) = 0 
      MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 ) 
      End 
    EndIf 
  EndIf 
  
  If CreateSprite(1000,24,24) 
    StartDrawing(SpriteOutput(1000)) 
    Box(0,0,24,24,RGB($0,$0,$FF)) 
    StopDrawing() 
  EndIf 
  
  Dep = 8 
  
  Repeat 
    
    ClearScreen(0,155,255) 
        DisplaySprite(1000, x, 100) 
    
    x + Dep 
    If x >=300 Or x <=0 : Dep = -Dep : EndIf 
    FlipBuffers() 

  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf
…une OpenWindowedScreen est crée dans un ContainerGadget lui meme contenu dans un ScrollAreaGadget.
Quand on manipule les barres de scroll, la zone ContainerGadget n’est rafraichie qu’en fin de manipulation produisant un affichage disgracieux mêlant saccades et scintillements.

Comment éviter cela pour obtenir un scrolling fluide ?

A la lumière de la série de messages suivante :
http://purebasic.hmt-forum.com/viewtopic.php?t=1462
l’idée etait de forcer le rafraichissement durant la manipulation en y glissant un RedrawWindow et autres UpdateWindow, mais rien de concluant en est sortie.(Rq: Pour ceux qui suivent : on sait déjà que rien n’est possible a ce sujet sur les messages #SB_PAGEDOWN et #SB_PAGEUP)

Quelqu’un a t’il une idée ?

... j’ai bien peur que la conclusion reste la meme: disposer de plus de souplesse sur ScrollAreaGadget.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

il faut le redessiner à chaque #wm_paint provenant du ContainerGadget

donc dans le calback, ça donne un truc du genre

Code : Tout sélectionner

if WindowID = gadgetID(ContainerGadget)
  if message = #WM_Paint
    
  endif
endif
c'est comme ça que je procède sur ma calculatrice par exemple (en un peu plus complexe car j'ai limité le rafraissement max de l'openwindowedscreen toutes les 30 ms, ça évite que l'affichage soit vraiment ralenti car affiché l'openwindowedscreen est comme assez long vu qu'on attand la synchro avec l'écran)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Hum… j’avais effectivement tenté de rafraichir le gadget container par un RedrawWindow lors d’un événement #WM_Paint :
le résultat est un écran qui flash dans se globalité !
Du coup c’est moins bien que de ne rien faire puisque dans ce dernier cas, seul la partie du container découverte par le scroll est rafraîchie.
Le flash se limite alors à une bande et non à la totalité de la surface container visible à l’écran !

Personnellement je ne possède aucune carte accélératrice 3D (et oui la vie est dure ;) ) et il est possible que ce phénomène soit limité sur certaines conf.

Ceci dit, on ne rencontre pas ce phénomène sur la plupart des applications et meme sur mon ordi. Donc une solution existe. Maintenant est-elle simple à mettre en œuvre sous PB, là est la question !?

PS : au passage, je ne vois pas le rapport avec ton prog Calculatrice (fort sympathique d’ailleurs, bravo !) puisqu’il n’y a pas de Scrollareagadget…
Répondre