JE voudrais savoir comment afficher en C un pixel noir bcp plus rapidement que drawpix.
Merci d'avance.

Sasume :
Faut pas donner du code tout fait![]()
Et tu peux optimiser le ((y)<<5) - (y) - (y) en (((y)+(y))<<4) - ((y)+(y))
Et le >>8 devrait être un >>3


VertyosOui c'est vrai, en même temps ce n'est pas compliqué et c'est intéressant de connaitre.
: 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.
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.
Sasume
: Oui c'est vrai, en même temps ce n'est pas compliqué et c'est intéressant de connaitre.
Oui, j'avais regardé et il générait un code correct.
Je savais pas que c'était possible d'utiliser ce genre d'optimisations en C.#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
}
}
Vertyos
:Oui, j'avais regardé et il générait un code correct.
Ah pas malJe savais pas que c'était possible d'utiliser ce genre d'optimisations en C.
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
[edit]Ou tout simplement (unsigned char)128
Link
: à mon avis c'est parfaitement égal...
Il en reconnaît même certaines beaucoup plus compliquées que celle-là. (Mais pas toutes, parce que c'est mathématiquement impossible.)Kevin Kofler
: Ho! On parle d'un vrai compilateur ici, pas d'un jouet on-calc.


)