Page 1 sur 1

gestion animation sprites par threads

Publié : mer. 24/févr./2010 0:27
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

Re: gestion animation sprites par threads

Publié : mer. 24/févr./2010 5:26
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 ...:)

Re: gestion animation sprites par threads

Publié : mer. 24/févr./2010 9:50
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.

Re: gestion animation sprites par threads

Publié : mer. 24/févr./2010 9:53
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 ...

Re: gestion animation sprites par threads

Publié : mer. 24/févr./2010 19:36
par case
ok je prend note,

je testerais une autre solution :)