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.
#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...
Kevin Kofler
: Ho! On parle d'un vrai compilateur ici, pas d'un jouet on-calc.