Vous n'êtes pas identifié.
Bon g trouvé que tt le monde utilisait la routine de whyp pour effacer l'écran en grayscale, et cette routine est excessivement lente! Elle efface trois pages, et en plus y'a une boucle for... Voici un peu de renouveau:
void clear(void) { asm mov i,0 asm mov ax,0x1A20 asm mov es,ax dboucle: asm mov si,i asm mov ax,0x0000 asm mov es:[si],ax asm add i,2 asm cmp i,1024 asm jbe dboucle asm mov i,2048 dboucle2: asm mov si,i asm mov ax,0x0000 asm mov es:[si],ax asm add i,2 asm cmp i,3072 asm jbe dboucle2; }
cette routine est encore optimisable, mais c'est déjà bcp mieux!
Elle n'efface que les plans VISIBLES et c des gotos à la place des for dc optimisation!
là g plus trop le tps dc d'autres routines à venir pê!
Hors ligne
voila il me semble la routine de pix/pix la lus économique qiu soit!
void gpixel(int x,int y,int c) { asm{ mov ax,0x1A20 mov es,ax mov bx,x mov si,y shl si,4 mov cl,bl shr bl,3 and cl,7 add si,bx cmp c,0 je wpix cmp c,1 je gpix cmp c,2 je bpix } wpix: asm { mov bh,0xFF db 0x0F,0x12,0x0C7 and es:[si],bh add si,0x0800 and es:[si],bh jmp end } gpix: asm { mov al,1 shl al,cl add si,0x800 or es:[si],al jmp end } bpix: asm { mov al,1 shl al,cl or es:[si],al add si,0x800 or es:[si],al jmp end } end:return; }
mais par contre celle là je sais pas si elle marche mais il me semble que oui!
Hors ligne
voila une autre version de clear mais pour un seul buffer:
void clrbuf(unsigned int segmt) { asm mov ax,segmt asm mov es,ax dboucle: asm mov si,i asm mov ax,0x0000 asm mov es:[si],ax asm add i,2 asm cmp i,1024 asm jbe dboucle }
Hors ligne
euhh... Je me pose des questions sur l'intéret de ces fonctions qd on efface l'écran on est po a la dixième de seconde près, non (C->ASM) et c ca tient plus de place l'asm pis pr la deuxieme fonx précise en kel mode c stp (G la flemme de vérifier..) M'enfin je di ca comme je dirai aut' chose prend le po mal et pis c bien ke kelkun optimise nos fonxions......
Hors ligne
ben c pr du Db!
ET puis j'en avais marre de voir tt le temps des boucles for qui te gachent tout, et 1/10e de seconde pr l'affichage ben c ENORME!!! fais des tests dans touche tu vas voir...
mais là c t les routines les plus grosses et les plus lentes que j'ai retranscrites en asm, pr accélérer un peu tt ça, cxar comme je l'ai dit ds mon premier post C TROP LENT!
Hors ligne
pr te rerépondre la fonx clear ne me sert personnellement qu'au début ou entre 2 menu et 1/10 de s ben voila koi !!
Hors ligne
Moi, ca me sert tout le temps, je la méterai pê, si ca se trouve, ca va charger plus vite certainne fenetre de TCX !
Hors ligne
ben déjà sans le double buffering y'avait bc moins de clignotement dans bomber! j'effaçais 2 couches au lieu de 3 avec cette routine, et en plus c plus rapide, donc déjà tu gagnes bcp de tps, surtout si tu fais des jeux "en boucle"
Hors ligne
une routine pour le contraste, id donnée par swifter:
void contrast(int ses,int niv) { int i; asm mov i,0 debut: asm cmp ses,1 asm je up asm mov ah,22h asm mov bl,0 asm int 7CH asm jmp next up: asm mov ah,22h asm mov bl,1 asm int 7CH next: asm cmp i,niv asm jbe debut }
Hors ligne
he j' en profites pour donner une petite fonction tres pratique puis qu'elle permet de regler le niveau de contrast ou on veut!!!
// a utiliser avec la fonction contrast() ci dessus void init_contrast(char niv) { contrast(0,22); contrast(1,niv);}
voila c'est tout simple rapide et pratique :P :P
petite explication: il y a 23 contrastes sur la caltos
donc il suffit de le baisser au minimum puis de l'augmenter au niveau voulu... voilou...
par contre ca perd peut etre un peu de temps... c pour ca que j'ai demande la fonx contraste() tout en asm
C'est tout
Hors ligne
Ben maintenant t'auras qu'a utiliser ma fonction puisque quel que soit le niveau de contraste au lancement du programme le contraste se met au niveau voulu ( de 0 a 22 ). Et tu ecris q'1 ligne de code :P :P
Hors ligne
Ouai ms nous on se base sur le contraste initial......
Hors ligne
Voila une routine qui efface l'écran plus vite que on ombre lol
mais g pas pu tester car g plus de cable et c du théorik
void clear (unsiged int segmt) { asm{ mov ax,segmt mov es,ax mov si,0x00 //mettez 0xFF pour rendre l'écran noir ou gris selon le mode xor di,di mov cx,0x200 cld rep movsw } }
vala!
dites mi si ça marche mais normalement c le plus rapide possible ... et marche ds ts les modes
Hors ligne
La c déja mieux.....
Hors ligne
Ah o fait Casiomax...
La fonction de contraste que tu m'as filée marche pô...
Ou alors c Tc3 qui déconne!!
Hors ligne
elle ne marche pas?
zarbi, je vais te la refaire!
mais svp testez ma ft pr effacer l'écran!
void clear (void) { asm{ mov si,0 xor di,di mov cx,0x200 cld rep movsw } }
celle là est un peu plus rapide, en fait g viré le mov es,segmt, dc à utiliser si vs êtes sûr d'être sur le bon buffer.
ps: dès que je peux je refais la routine pour le contraste!
Hors ligne
j'ai testé:
void clear (unsiged int segmt)
{
asm{
mov ax,segmt
mov es,ax
mov si,0x00 //mettez 0xFF pour rendre l'écran noir ou gris selon le mode
xor di,di
mov cx,0x200
cld
rep movsw
}
}
elle incontestablement plus rapide que celle que j'utilisais:
void clear(void)
{int page;
for(page=0;page<=2;page+=2)
{
int i;
asm mov ax,page;
asm shl ax,6;
asm add ax,0x1A20;
asm mov es,ax;
asm xor ax,ax;
for (i=0;i<1024;i+=2)
{
_SI=i;
asm mov es:[si],ax;
}
}}
Je m'en rend compte dans mon jeu VirtualBoxe car j'efface en permanence l'ecran et le clignotement est presque imperceptible.
mais ta fonction m'affiche des trucs noir au début de mon jeu et à la fin. je sais pas pourquoi.
j'ai testé aussi:
void clear (void)
{
asm{ mov ax,0x1A20
mov si,0
xor di,di
mov cx,0x200
cld
rep movsw
}
asm{ mov ax,0x1AA0
mov si,0
xor di,di
mov cx,0x200
cld
rep movsw
}
}
tout aussi rapide que l'autre et j'ai les meme truc bizarre au début du jeu et à la fin.
pour les truc bizarre je vais essayer de cibler mieux le prob.
Hors ligne
pour le mode N&B, le plus rapid ne serait pas le bon vieux:
clrscr();
???
Hors ligne
les trucs bizarre dont je parlais apparaissent quand je passe d'un mode à un autre
au debut de mon jeu je fais:
setDB(); // mise en marche du mode DB
clear(); // ta fonction
contrast(1,5);
à la fin du jeu j'ai ca dans mon prog
clear(); // j'affec les deux buffers
contrast(0,5);
setC3(); // mode C3
clrscr(); // indispensable pour ne pas avoir des truc noir sur mon ecran avec ta fonction
@+ et repondez moi aussi pour la ofnction clrscr() SVP (c'est pour mon tuto, je voudrais mettre de bonnes routines)
Hors ligne
casiomax >>> ca serait quand meme sympa que tu répondes ... c'est tout de meme ton post !!!
Hors ligne
excusez moi je croyais ke le post é t dead...
bon g lu vos ptits msgs et:
il faut d'abord effacer l'écran avec MON clear!!!!!! car clrscr c trop de la merde! ça efface pas tout l'écran en c3! donc forcément si tu passes en db sans effacer le seg entier ça te fera de la merde.
en gros tu dois avoir ça:
clear();
setDB();
{jeu}
clear();
setC3();
et c'est bon!
fais aussi attention aux buffers 0x1A60 et 0x1AE0, car ils sont utilisés pour le dbuf, donc peuvent contenir des images! à effacer si tu fais dou dbuf.
voila g tout dit, et est ce que l'autre ft clear marche? avec le rep ?[/code]
Hors ligne