660

geogeo :
Voici l'endroit où j'utilise cette méthode et ce avec des Listes de 15 items maximum.

//Efface un bonus
void DeleteBonus (unsigned char item)
{	
	//Interruption
	INT_START_BONUS=FALSE;
	
	//Coordonnées
	memcpy ((void *)(BONUS_xpos+item),(void *)(BONUS_xpos+item+1),(nbrBonus-item-1)<<1);
	memcpy ((void *)(BONUS_ypos+item),(void *)(BONUS_ypos+item+1),(nbrBonus-item-1)<<1);
	
	//Compteur animation
	memcpy ((void *)(BONUS_SHOWANIM+item),(void *)(BONUS_SHOWANIM+item+1),nbrBonus-item-1);
	
	//Sprites
	memcpy ((void *)(BONUS_TYPE+item),(void *)(BONUS_TYPE+item+1),nbrBonus-item-1);
	memcpy ((void *)(BONUS_SPRITE_ANIM+item),(void *)(BONUS_SPRITE_ANIM+item+1),nbrBonus-item-1);
	
	nbrBonus--;
	
	INT_START_BONUS=TRUE;
}

Et c'est faux! Remplace memcpy par memmove!
Nan mais là ça va à coup sûr boguer. Sauf que ce sera bien entendu au moment où tu t'y attendras le moins, et tu ne comprendras pas pourquoi.

Que fais la fonction memcpy au juste, est-il possible de voir la source de cette fonction???

Elle copie en général toujours dans le même sens, donc elle a une chance sur 2 d'écraser avant d'avoir fini de copier (et encore, la chance sur 2 n'est pas garantie, elle peut aussi toujours écraser les données si source et destination se chevauchent). Donc bogue garanti. memmove fait attention de ne pas écraser avant d'avoir copié (en général en choisissant le bon sens pour copier).

Et attention, strcpy se comporte comme memcpy! J'ai vu beaucoup trop de sources boguées qui utilisent strcpy sur des sources et destinations qui se chevauchent. sad Par exemple cette perle d'un certain Romain Liévin:
/*
  Remove beginning & ending '"' from files.
  The string is modified in place !
*/
char* tail_long_filename(char *file)
{
    char *p = file;

    if( (file[0] != '\"') && (file[strlen(file)] != '\"') )
	return file;
    
    strcpy(file, ++p);     /* remove first quote */
    p[strlen(p)-1] = '\0'; /* remove last quote */

    return file;
}

Il y avait cette horreur dans le tprbuilder de TIGCC jusqu'à la version 1.0.7. La version 1.0.8 livrée avec toutes les versions actuelles de TIGCC contient ma correction:
/*
  Remove beginning & ending '"' from files.
  The string is modified in place !
*/
char* tail_long_filename(char *file)
{
    char *p = file;

    if( (file[0] != '\"') && (file[strlen(file)] != '\"') )
        return file;
    
    p++;
    memmove(file, p, strlen(p)+1); /* remove first quote */
    p[strlen(p)-1] = '\0';         /* remove last quote */

    return file;
}
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

661

./659
Certainement, je suis une merde en optimisation, et en plus je ne sais même pas si ce que j'ai posté se compilerait, mais c'était juste pour expliquer.
Sinon que fait TI de spécial pour être si rapide?
[Post croisé]
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

662

Ils déroulent leur boucle, tout simplement
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

663

#juste pour info#ça consiste en koi dérouler une boucle?#/juste pour info#

664

Faire du copier-coller de code assembleur pour gagner quelques cycles insignifiants en multipliant la taille du code par le nombre de déroulements (donc par un entier strictement supérieur à 1, donc au moins par 2).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

665

Mais après c'est toujours le même combat : en algo pur, dérouler une boucle est *presque* une hérésie. En optimisation vitesse, c'est un passage obligé.
avatar

666

Comment peut-on dérouler une boucle puisqu'on ne sait pas à l'avance le nombre d'octets qu'il y aura à copier? (càd le nombre d'itérations de la boucle)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

667

Il suffit de ne pas commencer forcément au début de la boucle, mais au milieu.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

668

Cf. "Duff's device" et son équivalent (beaucoup plus naturel) en assembleur.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

669

OK je comprend donc je vais utiliser memmove.

Par contre j'ai passé une gtrande partie de l'après midi sur une fonction de collision avec des sprites de 32 pixels et elle ne fonctionne pas parfaitement car il faut couper la collision en 2 partie soit 2 registres de 32 bits.

Voici la source.
#define SWAPDATA(a,b) asm volatile ("exg %0,%1" : "=d" (a), "=d" (b) : "0" (a), "1" (b) : "cc")
BOOL TestCollideSprite32 (short x0, short y0, short x1, short y1, unsigned char h, unsigned long *sprite0, unsigned long *sprite1)
{
	short dx,dy,i;
	short dx2;
		
	//Sprite 0 à droite de sprite 1
	if (x0<x1) 
	{
		dx=x1-x0;
	}
	else
	{
		dx=x0-x1;
		SWAPDATA (sprite0,sprite1);
		SWAPDATA (y0,y1);
	}
	
	if (dx>=32) return 0; //Aucune collision
	
	if (y0<y1)
	{
		dy=y1-y0;
		sprite0+=dy;
	}
	else
	{
		dy=y0-y1;
		sprite1+=dy;
	}
	
	dx2=32-dx;
	
	for (i=dy;i<h;i++,sprite0++,sprite1++)
	{	
		if ((((unsigned long)*sprite1) & (((unsigned long)*sprite0)>>dx)) || (((unsigned long)*(sprite1)) & (((unsigned long)*(sprite0))<<dx2)))
			return 1;
	}
	
	return 0;


Je me suis basé sur les sources de collide8 d'extgraph mais malgré ça je ne vois pas comment l'adapter pour des sprites de 32 pixels de largeur. sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

670

Hmm, faire ça en C risque de ralentir ton programme...
Le truc que tu dois garder à l'esprit, c'est que si sprite de 32 pixels de largeur tient parfaitement dans un registre 32 bits, tu peux donc faire la collision avec un seul registre 32 bits, vu que seules les parties qui se recoupent (jamais plus de 32pixels) t'intéressent...
C'est aussi simple que ça
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

671

Je compte faire ça en ASM après mais déjà faut que je sache comment ça fonctionne.
OK j'avais pas piger ça car en faite les algos d'extgraph lors du tests de collision utilie une registre 2 fois plus grand que le sprite.
Merci pour l'info. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

672

geogeo
: il faut couper la collision en 2 partie soit 2 registres de 32 bits.

Pas nécessairement. http://tigcc.ticalc.org/doc/gnuexts.html#SEC72. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

673

Merci mais malgré ça la routine fonctionne à moitié. sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

674

J'ai enfin réalisé la routine et elle fonctionne.
Maintenant est-il possible avec ce genre de méthode de collision de pouvoir déterminer le nombres de pixels minimum qu'il me faut pour sortir de cette collision? Car je suis capable de renvoyer le nombres pixels suivant y mais pas x.
C'est peut être tout simplement impossible???
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

675

Euh btst.l tripaf
Mais je ne pense pas que tu tiennes à essayer grin
Sinon, sans bcp te faire c***r, tu peux réduire le masque de collision. Je veux dire par exemple que si ton sprite est un carré de 24 * 25, tu diminues sa taille en un carré de 22 * 23 comme ça seules les collisions avancées entreront en compte happy
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

676

Ah oui j'ai oublié de dire que je considère le masque comme plain donc sans trous par ligne...
Mais il y a pas une méthode suivant le ET logique qu'on réupére et le décalage neccessaire pour effectuer la collision?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

677

du type: OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOOJ'avais le même problème que toi. Je l'ai résolu en prenant un masque Ainsi tu peux détecter les collisions à gauche et à droite suivant le numéro de ligne où elle a eu lieu. Bon il y a aussi une tonne d'autres astuces qui vont avec pour éviter les problèmes (d'ailleurs la routine de test de collisions est devenue immense)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

678

Merci Brunni mais une idée m'est venu et je vais la tester. wink
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

679

Ca fonctionne pas.
En gros il faudrait tester le nombres de bits qu'il y a dans le résultat de la collision sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

680

Essaye ça, ça t'aidera peut-être:
| unsigned long bit_count_32(unsigned long value asm("d2"));
bit_count_32:
  moveq #31,%d1
  moveq #0,%d0
__bc32_loop:
  btst.l %d1,%d2
  jbeq __bc32_bitcleared
  addq.b #1,%d0
__bc32_bitcleared:
  dbf %d1,__bc32_loop
  rts

J'ai pas testé, mais ça devrait fonctionner.
EDIT: je modifie les types
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

681

Merci. smile
J'ai interêt à créer mes routines de collisions en ASM. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

682

Pour la fonction bit_count, tu peux peut-être faire plus simple en utilisant un lsr et en regardant l'état du bit C du CCR.
Ça t'évitera le addq, le dbf, et le moveq #0 smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

683

int bit_count(long x asm("d1"));
bit_count:
moveq.l #31,%d2
clr.w %d0
0:
add.l %d1,%d1
bcc.s 1f
addq.w #1,%d0
1:
dbra.w %d2,0b
rts


Si tu as besoin de la même chose sur 64 bits, la voilà:
int bit_count(long long x asm("d1"));
bit_count:
lea 32:w,%a0
clr.w %d0
0:
add.l %d2,%d2
addx.l %d1,%d1
bcc.s 1f
addq.w #1,%d0
1:
subq.w #1,%a0
cmpi.w #0,%a0
bne.s 0b
rts
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

684

Euh, Kevin, y'a des erreurs dans tes déclarations... grin
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

685

Plus maintenant. grin
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

686

Nan, ça y est toujours grin
Soit tu changes les clr.w %d0 en moveq #0,%d0 soit tu changes les ints en shorts, mais tu devrais corriger ça
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

687

int==short
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

688

Ah bon confus ? Je croyais que les int étaient 32 bits sur TI sad.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

689

En tout cas même en comptant le nombres de bits ça ne fonctionne pas à merveille car les sprites peuvent être irrégulier. Je vais resté avec 0 ou 1 comme résultat et effectuer un while pour sortir de cette collision. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

690

À mon tour :
int bit_count(long x asm("%d0"));
bit_count:
  moveq.l #33,%d1
Loop:
  subq.w  #1,%d1
  add.l   %d0,%d0
  bcc.s   Loop
  rts
Mais ça suppose qu'on a dans d0 une valeur non nulle.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »