gestion animation sprites par threads

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

gestion animation sprites par threads

Message par case »

une question a la con, est-ce que gérer l'animation de sprites via des threadd est une bonne facon de procéder ?

Code : Tout sélectionner

Procedure newsprite(id,image.s,x,y,l,h,frames=1,timer=1,auto=0,transp=$ff00ff)
  ClearScreen(0)                                    ; efface l'ecran
  *mem=*memory+freemem                              ; calcule l'adresse dans le buffer en memoire ou est stocké l'adresse du sprite
  If IsImage(Val(image))                            ; si une image existe avec la valeur de la chaine image deja en memoire
    img=ImageID(Val(image))                         ; +-- 
    StartDrawing(ScreenOutput())                    ; !  
    DrawImage(img,0,0)                              ; !affiche l'image
    StopDrawing()                                   ; +--
  ElseIf FileSize(image)                           ; sinon on verifie qu'un fichier existe avec le nom de l'image
    temp=LoadImage(#PB_Any,image)                   ; on charge l'image
    img=ImageID(temp)                               ; +--
    StartDrawing(ScreenOutput())                    ; !  
    DrawImage(img,0,0)                              ; !affiche l'image
    StopDrawing()                                   ; +--
    FreeImage(temp)                                 ; libere la memoire
  EndIf
  ;      ------------ genere les sprites  -----------------------
  For frame=1 To frames                             ; pour chaque frame
    sprite=GrabSprite(#PB_Any,x+((frame-1)*l),y,l,h) ; on grab un sprite
    TransparentSpriteColor(sprite, transp)           ; on defini la couleur transparente  
    PokeI(*memory+freemem,sprite)                    ; on ecrit l'adresse du sprite en memoire
    freemem+8                                        ; on incremente l'offset du bloc memoire 
  Next
  sprites(id)\Memstart=*mem                          ; on ecrit l'adresse de depart du sprite dans le buffer memoire
  sprites(id)\frames=frames                          ; on ecrit le nombre de frames
  sprites(id)\frametimer=timer                       ; on ecrit le timer
  sprites(id)\thisframe=0                            ; frame actuelle
  ;  -------------------- animation automatique ----------------------------
  If auto=1                                         ; si animation automatique (par thread)
    If frames>1                                     ; et si il y aplusieur frames 
      CreateThread(@updatesprites(),id)             ; creation d'un thread pour animer ce sprite
    EndIf
  EndIf
EndProcedure

en gros si le sprite est animé et que j'ai mis le flag auto ca genere un thread qui anime le sprite independament du reste du programme

Code : Tout sélectionner

Procedure updatesprites(*nb)
nb_frames=sprites(*nb)\frames
count=sprites(*nb)\frametimer
  Repeat
    Delay(10)   ;<------ pas sur que ce soit super propre
    fr+1
    If fr>=count
    fr=0
      frame+1
      If frame<nb_frames
        sprites(*nb)\thisframe =frame
      Else
        sprites(*nb)\thisframe =0
        frame=0
      EndIf
    EndIf
  ForEver ;<--------------- je sais que c'est déconseillé 
EndProcedure
le sprite est ensuite affiché comme ca

Code : Tout sélectionner

Procedure showsprite(nb,x,y)
If sprites(nb)\Memstart<>0
  sprite= PeekI(sprites(nb)\Memstart+(((sprites(nb)\thisframe))*8))
  If IsSprite(sprite)
    DisplayTransparentSprite(sprite,x,y)
  EndIf
EndIf
EndProcedure
ImageImage
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: gestion animation sprites par threads

Message par Backup »

oui ton delay() est peut etre a éviter ! , pour une question de régularité

voir la fonction OpenScreen() qui prend un parametre de synchro... , en principe par defaut

ou l'emploi d'un timer ,qui devrai etre plus régulier....

cette approche est intéressante , enfin surtout pour ceux qui ont des multicores... :)

mais je suis pas sur que le mode traditionnel , ne marche pas aussi bien ....
j'ai fait des jeux ou rien que le fond etoilés prenait 1000 sprites sans ramer ...:)
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: gestion animation sprites par threads

Message par Fred »

Non, je ne ferais pas ca etant donné que les sprites sont gérés par la carte graphique et que t'en as qu'une cela n'apporte rien (à part complexifier ton code). Des plus creer des threads etc prend du temps donc ton programme sera moins performant au final.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: gestion animation sprites par threads

Message par case »

est-ce que le temps processeur pris sera le même qu'un programme n'utilisant pas les threads ?

est-ce que son exécution sur un processeur simple cœur vas être différente ?

après tout si je regarde le gestionnaire de tache je vois clairement que certain processus utilisent plusieurs threads ...
ImageImage
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: gestion animation sprites par threads

Message par case »

ok je prend note,

je testerais une autre solution :)
ImageImage
Répondre