CPC Rulez https://cpcrulez.fr/forum/ |
|
routine de sprites https://cpcrulez.fr/forum/viewtopic.php?f=4&t=5069 |
Page 1 sur 2 |
Auteur : | neocps1 [ 03 Juin 2013, 18:43 ] |
Sujet du message : | routine de sprites |
Bonjour, Je sais que le sujet a été évoqué à maintes fois, mais j'aimerais juste avoir votre avis sur cette routine. A noter que la largeur d'écran est de 128 pixels : merci ! Code : typedef struct
{ unsigned char x, y; unsigned char* pData; } tSprite8x16; void sprite_8x16_draw(tSprite8x16* pSprite) { __asm ;; load IX with sprite information ld l,4 (ix) ld h,5 (ix) push hl pop ix ; calculate sprite screen adress in hl ld hl,#_aScreenLinesOffset ld e,1(ix) ld d,#0 rl d rl e add hl,de ld a,(hl) ld e,a inc hl ld a,(hl) ld d,a push de pop hl ld e,0(ix) ld d,#0 add hl,de ; load de with adress to sprite data ld e,2(ix) ld d,3(ix) ld bc,#0x0208 sprite_draw_loop: sprite_next_pixel_0: ld a,(de) inc de or a jp z, sprite_next_pixel_1 ld (hl),a sprite_next_pixel_1: inc hl ld a,(de) inc de or a jp z, sprite_next_pixel_2 ld (hl),a sprite_next_pixel_2: inc hl ld a,(de) inc de or a jp z, sprite_next_pixel_3 ld (hl),a sprite_next_pixel_3: inc hl ld a,(de) inc de or a jp z, sprite_next_row ld (hl),a sprite_next_row: ld a,l add #0xfd ld l,a ld a,h adc #0x7 ld h,a dec c jp nz,sprite_draw_loop ld c,#0x08 ld a,l add #0x40 ld l,a ld a,h adc #0xc0 ld h,a dec b jp nz,sprite_draw_loop __endasm; } |
Auteur : | neocps1 [ 03 Juin 2013, 19:10 ] |
Sujet du message : | Re: routine de sprites |
j'ai oublié de préciser que cette routine ne permet d'afficher que des sprites de 8x16 en mode 0 |
Auteur : | neocps1 [ 03 Juin 2013, 21:03 ] |
Sujet du message : | Re: routine de sprites |
même routine, mais façon "masque". Elle est plus gourmande que la version précedente, autant en termes de temps d'execution que de mémoire. Par contre, la transparence est parfaite (au pixel près) Code : void sprite_8x16_mask_draw(tSprite8x16* pSprite)
{ __asm ;; load IX with sprite information ld l,4 (ix) ld h,5 (ix) push hl pop ix ; calculate sprite screen adress in hl ld hl,#_aScreenLinesOffset ld e,1(ix) ld d,#0 rl d rl e add hl,de ld a,(hl) ld e,a inc hl ld a,(hl) ld d,a push de pop hl ld e,0(ix) ld d,#0 add hl,de ; load de with adress to sprite data ld e,2(ix) ld d,3(ix) ld bc,#0x0208 sprite_draw_mask_loop: ;; ld a,(de) and (hl) inc de ld (hl),a ld a,(de) or (hl) inc de ld (hl),a inc hl ;; ld a,(de) and (hl) inc de ld (hl),a ld a,(de) or (hl) inc de ld (hl),a inc hl ;; ld a,(de) and (hl) inc de ld (hl),a ld a,(de) or (hl) inc de ld (hl),a inc hl ;; ld a,(de) and (hl) inc de ld (hl),a ld a,(de) or (hl) inc de ld (hl),a ld a,l add #0xfd ld l,a ld a,h adc #0x7 ld h,a dec c jp nz,sprite_draw_mask_loop ld c,#0x08 ld a,l add #0x40 ld l,a ld a,h adc #0xc0 ld h,a dec b jp nz,sprite_draw_mask_loop __endasm; } |
Auteur : | markerror [ 03 Juin 2013, 21:59 ] |
Sujet du message : | Re: routine de sprites |
Hum, si j'ai a peu près pigé la première routine, je ne vois pas trop l'intérêt de faire un test pour vérifier si un octet du sprite a une valeur 00. Il est plus rapide de recopier simplement systématiquement les valeurs. L'usage de LDI dans ce cas présent semblerait approprié, mais il faudrait alors modifier pas mal de choses dans la routine. Sans tout chambouler, on peut aussi gagner un petit peu de temps en partant du principe que les sprites ont une taille paire et commencent à une adresse ram paire. Une fois sur deux, on peut utiliser alors un INC E au lieu de INC DE car on est alors sûr qu'il n'y a pas de risque de débordement. |
Auteur : | neocps1 [ 04 Juin 2013, 05:33 ] |
Sujet du message : | Re: routine de sprites |
Je teste si la valeur est 0 pour gérer la transparence |
Auteur : | hERMOL [ 04 Juin 2013, 16:14 ] |
Sujet du message : | Re: routine de sprites |
en mode 0 -> 1 octet = 2 pixels , alors ton test n'est pas complet.. le pavé sur le création de sprites et animation de MICHEL MAIGROT , devrais t'intéresser. Ca réponds aux question que tu te pose --> https://cpcrulez.fr/coding_graphic-09-cr ... __SOSP.htm |
Auteur : | neocps1 [ 04 Juin 2013, 19:20 ] |
Sujet du message : | Re: routine de sprites |
tout à fait, par contre le test est juste avec la deuxième version. Dommage que ça double la quantité de mémoire nécessaire par sprite. |
Auteur : | neocps1 [ 09 Juin 2013, 13:18 ] |
Sujet du message : | Re: routine de sprites |
Je me pose des questions sur l'efficacité de mon code. En gros, l'affichage d'un sprite de 8x32 (8 pixels / 32 lignes) en mode 0 dure quasiment la moitié d'une trame, ce qui limite sévèrement le nombre de sprites par trame. J'ai merdé quelque part ? J'optimise comme un boeuf ou c'est normal ? Voila une capture pour illustrer le timing : - vert on restaure l'arrière plan qui aurait pu être écrasé par les sprites de la trame précédente - jaune on sauvegarde l'arrière plan pour la trame courante - vert j'affiche le sprite de 8x32 en transparence (technique du masque avec un tableau de précalcul de 256 octets) : |
Auteur : | Megachur [ 09 Juin 2013, 16:30 ] |
Sujet du message : | Re: routine de sprites |
voilà pourquoi les concepteurs de consoles et d'ordinateur sont rapidement allés vers le développement de sprites 'hard' ! comme c'est pas le cas sur le cpc old, il va falloir que tu optimises et/ou limite le nb de sprites affichés à l'écran !!! mais je suis sûr qu'on pourra t'aider ! |
Auteur : | neocps1 [ 09 Juin 2013, 17:28 ] |
Sujet du message : | Re: routine de sprites |
oui, mais ca te parait déconnant le temps que prennent mes routines ou pas ? |
Auteur : | fano [ 09 Juin 2013, 17:57 ] |
Sujet du message : | Re: routine de sprites |
8*32 , c'est 8 pixels ou 8 octets ? |
Auteur : | hERMOL [ 09 Juin 2013, 19:00 ] |
Sujet du message : | Re: routine de sprites |
si c'est le timing pour l'affichage de tout ces sprites , je trouve pas ca enorme.. en comptant les pixels de tes tiles je suis a 8x16 pixel ou 4x16 octets .. |
Auteur : | neocps1 [ 09 Juin 2013, 19:05 ] |
Sujet du message : | Re: routine de sprites |
non non, les tiles ici (les murs) ne sont affichés qu'une seule fois, et ne comptent pas dans le timing. Il y a bien un sprite de 8x32 (4 octets/32 lignes en mode 0) d'affiché, mais masqué par un problème de synchro avec la vbl. |
Auteur : | fano [ 09 Juin 2013, 19:18 ] |
Sujet du message : | Re: routine de sprites |
Donc pour répondre à ta question , pour un format de 4*32 octets je trouve ça effectivement lent.A mon avis avant de voir pour optimiser ton code , il faut peut être revoir le format de tes données. |
Auteur : | neocps1 [ 09 Juin 2013, 20:13 ] |
Sujet du message : | Re: routine de sprites |
quelques conseils ? |
Page 1 sur 2 | Le fuseau horaire est UTC+1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |