1

JE voudrais savoir comment afficher en C un pixel noir bcp plus rapidement que drawpix.
Merci d'avance.
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

2

Tu peux écrire ta propre fonction, ou mieux, ta propre macro.
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. »

3

#define PxlOn(x,y,b) *((unsigned char*)(b) + ((x) >> 3) + ((y) << 5) - (y) - (y)) |= (128 >> ((x) & 7))

puis par exemple PxlOn(42,42,LCD_MEM).
(j'ai pas testé, ya pê une petite erreur de signe)

[edit] planté dans la division par 8
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Faut pas donner du code tout fait embarrassed trinon
Et tu peux optimiser le ((y)<<5) - (y) - (y) en (((y)+(y))<<4) - ((y)+(y))
Et le >>8 devrait être un >>3 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. »

5

Sasume :
Faut pas donner du code tout fait embarrassed trinon

Pour le coup si il pose la question c'est qu'il ne sait pas faire, et c'est pas le genre de truc qui s'invente en 5 minutes quand on connait pas le fonctionnement de la memoire vidéo.
Et tu peux optimiser le ((y)<<5) - (y) - (y) en (((y)+(y))<<4) - ((y)+(y))

k. GCC est capable de faire l'addition, conserver le résultat, décaler par 4 et soustraire ?
Et le >>8 devrait être un >>3 smile

Bah j'ai édité avant que tu poste, je pensais "diviser par 8" et du coup g écrit >>8 triso
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

Et tu peux essayer autre chose (non testé) : machin |= ((char)-128)>> ((x) & 7)
Peut-être que GCC génèrera un moveq.l #-128 au lieu d'un move.w #128, qui est 2 fois plus lent sad
[edit] Ou tout simplement (unsigned char)128 triso
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. »

7

Vertyos
: Pour le coup si il pose la question c'est qu'il ne sait pas faire, et c'est pas le genre de truc qui s'invente en 5 minutes quand on connait pas le fonctionnement de la memoire vidéo.
Oui c'est vrai, en même temps ce n'est pas compliqué et c'est intéressant de connaitre.
k. GCC est capable de faire l'addition, conserver le résultat, décaler par 4 et soustraire ?
Oui, j'avais regardé et il générait un code correct.
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. »

8

Ca marche!
Mais c'est pas assez rapide...

Par exemple pour la rotation d'image, si on laisse tourner,on a l'impression qu'il y a des niveaux de gris.Et si c'est une grande image, on a le temps de voir s'afficher les pixels!
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

9

Sasume
: Oui c'est vrai, en même temps ce n'est pas compliqué et c'est intéressant de connaitre.

Il pourra toujours revenir dessus plus tard smile
Perso j'ai affiché des pixels bien avant de comprendre comment ça marchait grin
Oui, j'avais regardé et il générait un code correct.

Ah pas mal smile Je savais pas que c'était possible d'utiliser ce genre d'optimisations en C.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

Écoute, le mieux c'est que tu intègres l'affichage de pixel à ton programme, ça t'évitera de recalculer l'offset à chaque pixel...
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. »

11

En fait, merci vertyos,car j'aurais pas trouve tout seul! (j'suis debutant...)
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

12

bein ya rien de bien compliqué, suffit de savoir que 1bit = 1 pxl .

13

Comment je l'integre au programme?
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

14

Pour cela, il faut que tu comprennes comment ça fonctionne smile
JackosKing t'a donné une piste au post ./12
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. »

15

Bon voici mon prog (tres mauvais je pense) :

#define USE_TI89              // Compile for TI-89
#define OPTIMIZE_ROM_CALLS    // Use ROM Call Optimization
#define MIN_AMS 100           // Compile for AMS 1.00 or higher
#define SAVE_SCREEN           // Save/Restore LCD Contents
#include <tigcclib.h>         // Include All Header Files

#define PxlOn(x,y,b) *((unsigned char*)(b) + ((x) >> 3) + ((y) << 5) - (y) - (y)) |= (128 >> ((x) & 7)) 


void rotate(int );
void zoom(int ,int );
void _main(void)
{
  int curs=1,rect=0;
  long i;
	OSSetSR (0x0700);
deb:
	curs=1;rect=0;
	ClrScr();
	DrawStr (15, 10, "MOTEUR 3D", A_NORMAL);
	DrawStr (20, 40, "ROTATION", A_NORMAL);
	DrawStr (20, 55, "ZOOM", A_NORMAL);
	DrawStr (20, 70, "QUITTER", A_NORMAL);
	for (;;)
	{
	BEGIN_KEYTEST
		if (_keytest_optimized (RR_UP)) 
		{
		ScrRectFill(&(SCR_RECT){{20, 15*curs+24, 140, 15*curs+33}}, &(SCR_RECT){{0, 0, 159, 99}}, A_XOR);
		rect=0;
		curs--;
		}
  	if (_keytest_optimized (RR_DOWN)) 
  	{
  	ScrRectFill(&(SCR_RECT){{20, 15*curs+24, 140, 15*curs+33}}, &(SCR_RECT){{0, 0, 159, 99}}, A_XOR);
  	rect=0;
  	curs++;
  	}
  	if (_keytest_optimized (RR_ENTER)||_keytest_optimized (RR_2ND)) 
  	{
  		if (curs==1){rotate(0);goto deb;}
  		if (curs==2){zoom(24,24);goto deb;}
  		if (curs==3){for (i=0;i<50000;i++);break;}
  	}
	END_KEYTEST 
	if (curs==4)curs=1;  
	if (curs==0)curs=3;  
	
	if (rect==0)
	{
		ScrRectFill(&(SCR_RECT){{20, 15*curs+24, 140, 15*curs+33}}, &(SCR_RECT){{0, 0, 159, 99}}, A_XOR);
		rect++;
	}
	for (i=0;i<40000;i++);
	}
	
	
}
void rotate(int angle1)
{
	int xpic,ypic,x,y;
	int co,si;
	int i,j;
	float angle;
	char pic[257]="1111111111111111000100010001000100010001000100011111111111111111010001000100010001000100010001001111111111111111000100010001000100010001000100011111111111111111010001000100010001000100010001001111111111111111000100010001000100010001000100011111111111111111";
	short pic1[257];
  for (i=0;i<256;i++)
  {
  pic1[i]=pic[i]-48;   
  }
	
deb:  
  angle=angle1*PI/180;
 
  	co=cos(angle)*50;
  	si=sin(angle)*50;

  	ClrScr();
		xpic=16;
		ypic=16;
		for (i=0;i<xpic;i++)
			{
			for (j=0;j<ypic;j++)
				{
				if (pic1[16*j+i]==1)
					{
						x=co*i/50+si*j/50+50;
						y=co*j/50-si*i/50+50;
						PxlOn (x, y,LCD_MEM); 
					}
			 
				}
			}

  

for ()
{
	BEGIN_KEYTEST
		if (_keytest_optimized (RR_LEFT)) {angle1=angle1-5; goto deb;}
  	if (_keytest_optimized (RR_RIGHT)) {angle1=angle1+5; goto deb;}
  	if (_keytest_optimized (RR_ESC)) break;
	END_KEYTEST   
}			 
}


void zoom(int x1,int y1)
{
	int i,j;
	char pic[257]="1111111111111111000100010001000100010001000100011111111111111111010001000100010001000100010001001111111111111111000100010001000100010001000100011111111111111111010001000100010001000100010001001111111111111111000100010001000100010001000100011111111111111111";
	short pic1[257];
  for (i=0;i<256;i++)
  {
  pic1[i]=pic[i]-48;   
  }
deb:  
  	ClrScr();
		for (i=0;i<x1;i++)
			{
			for (j=0;j<y1;j++)
				{
				if (pic1[i*16/x1+j*16/y1*16]==1)
					{
						 PxlOn(i+30, j+30,LCD_MEM); 
					}
			 
				}
			}

  

for()
{
	BEGIN_KEYTEST
		if (_keytest_optimized (RR_LEFT)) {x1++;y1++; goto deb;}
  	if (_keytest_optimized (RR_RIGHT)) {x1--;y1--; goto deb;}
  	if (_keytest_optimized (RR_ESC)) break;
	END_KEYTEST   
}			 
}



Prenez pas peur avec la gestion de l'image, c'est juste un essai!!! (j'suis pas nul a ce point)
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

16

C'est un peu le fouilli, surtout dans la première fonction, mais sinon à mon avis ce qui ralentit ton programme, ce n'est pas vraiment l'affichage des pixels, mais les multiplications et divisions, et l'utilisation des fonctions cos et sin.
Remplace 50 par 32 et ça ira sûrement déjà un peu plus vite.
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. »

17

utilise une table de cos/sin..
avatar
Plus t'avance moins vite
Moins t'avance plus vite...

forums/406

18

au lieu de for() tu devrais utiliser while(1) c légèrement plus rapide pasque il n'a a tester que la condition 1
avatar
Wenn ich morgen meinem Gott gegenübertrete, kann ich ihm sagen: "Ich bin unschuldig, ich hab' niemandem etwas getan - außer mir selben" Und das verzeiht er mir offentlich !
Falco - Hans Hölzel 1957 - 1998
RIP

19

... surment pas

20

a bon?
for() c + rapide que while(1)??
avatar
Wenn ich morgen meinem Gott gegenübertrete, kann ich ihm sagen: "Ich bin unschuldig, ich hab' niemandem etwas getan - außer mir selben" Und das verzeiht er mir offentlich !
Falco - Hans Hölzel 1957 - 1998
RIP

21

à mon avis c'est parfaitement égal...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

22

Vertyos
:
Oui, j'avais regardé et il générait un code correct.

Ah pas mal smile Je savais pas que c'était possible d'utiliser ce genre d'optimisations en C.

Ho! On parle d'un vrai compilateur ici, pas d'un jouet on-calc.
Sasume :
Et tu peux essayer autre chose (non testé) : machin |= ((char)-128)>> ((x) & 7)
Peut-être que GCC génèrera un moveq.l #-128 au lieu d'un move.w #128, qui est 2 fois plus lent sad

Ça ne marchera pas. (char)-128 est promu en (int)-128 avant le calcul, et du coup tu décales des bits parasites.
[edit]Ou tout simplement (unsigned char)128

Ça par contre, ça devrait marcher. Ça sera promu en (int)128 avant le calcul. Mais j'ai bien peur que ça ne changera rien au code produit.
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é

23

Link
: à mon avis c'est parfaitement égal...

Et c'est bien le cas. GCC sait quand-même reconnaître les boucles infinies... roll Il en reconnaît même certaines beaucoup plus compliquées que celle-là. (Mais pas toutes, parce que c'est mathématiquement impossible.)
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é

24

Kevin Kofler
: Ho! On parle d'un vrai compilateur ici, pas d'un jouet on-calc.

N'en profite pas pour faire des allusions, y'a d'autres topics pour parler de ça (incident clos, prochain coup kick).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

25

lol, incorrigible smile
C'est dommage qu'on ne puisse pas faire générer un moveq.l #-128...
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. »

26

Il y a une manière assez simple de le faire: envoie-moi un patch pour GCC qui le fait. 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é

27

Mouais, je n'ai pas vraiment le temps ni la motivation de me plonger dans les sources de GCC pour corriger ça.
De toute façon, à ce niveau de précision, il vaut mieux directement passer en ASM 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. »

28

mourn Personne ne veut m'aider avec GCC pour TIGCC... mourn
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é

29

Qu'est-ce que tu veux, ce n'est pas de ma faute si certains préfèrent faire des "compilateurs-jouets" qui, eux, savent générer ça tongue

(Vertyos> OK c'est off-topic mais c'était trop tentant après l'attaque lâche et fourbe de Kevin grin)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

30

bon 1 partout ça suffit maintenant vous êtes quittes, allez vous taper dessus ailleurs happy
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.