Quelques routines graphiques performantes (négatif d'une image,balance rvb,noir et blanc)

3/5 (8 avis)

Vue 6 294 fois - Téléchargée 668 fois

Description

Ce programme sert à présenter quelques routines de ma composition.
Ces routines sont en assembleur et optimisés au maximum (ou presque)
Le zip présente un exemple d'utilisation de ces routines.

Source / Exemple :


Tous dans le zip

Conclusion :


Bien entendu tous vos commentaires sont les bienvenus, en particulier si vous trouvez le moyen d'obtenir des routines plus performantes ( j'en doute ;-) ).

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_cam91 Messages postés 19 Date d'inscription dimanche 9 juin 2002 Statut Membre Dernière intervention 4 février 2006
27 juil. 2002 à 22:47
je viens de découvrir que pour la routine NB il y avait moyen d'accélerer beaucoup le code en remplacant la division par une multiplication:

@b1:
mov edx,dword [edi] //edx:8*0 8*r 8*v 8*b
xor eax,eax;xor ecx,ecx;mov al,dl;mov cl,dh
add ax,cx;shr edx,16;mov cl,dl
add ax,cx //ax=cr+cv+cb
// à la place de xor edx,edx;mov ecx,3;idiv ecx on écrit
imul eax,21845
shr eax,16 //multiplication par 0,33333

imul edx,eax,$010101
mov dword [esi],edx //edx:8*0 8*cnb 8*cnb 8*cnb
add edi,4;add esi,4 //saut de 32 bit, pixel suivant
cmp edi,lim //boucle jusqu'à edi=lim
jne @b1

En fait au lieu de diviser par 3 on multiplie par 21845/(2^16)=0,333328 Très éfficace quand on sait la lourdeur d'une division en assembleur.
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
1 juil. 2002 à 22:06
Merci, mais je viens de vérifier un peu la différence de vitesse car j'étais resté sur les souvenirs d'un 386. Or il apparait que de travailler sur les registres et mémoires 8 bits est beaucoup plus long. Ainsi ce que je t'ai dis pour le bleu est faux :
@b1:
mov edx,dword [edi]
shl edx,24
shr edx,24
mov dword [esi],edx
add edi,4;add esi,4 //saut de 32 bit, pixel suivant
cmp edi,lim
jne @b1
( 16,8 secondes pour 1000 boucles )
est plus rapide que
xor edx,edx
@b1:
mov dl,byte [edi]
mov dword [esi],edx
add edi,4;add esi,4 //saut de 32 bit, pixel suivant
cmp edi,lim
jne @b1
( 19,3 secondes pour 1000 boucles )

Amusant non ?

Note que le source le plus court ( en taille ) pour le bleu serait le suivant :
asm
push edi
push esi
mov ecx,npix
mov esi,addrsource
mov edi,addrDest
xor eax,eax
@b1:
mov al,byte [ecx*4+esi-4]
mov dword [ecx*4+edi-4],eax
loop @b1
pop esi
pop edi
end;
( 19,7 secondes pour 1000 boucles )

Et le plus rapide que j'ai trouvé est le suivant :
asm
push edi
push esi
mov eax,npix
shl eax,2
add eax,addrsource
mov lim,eax
mov esi,addrsource // j'ai inversé ESI et EDI
mov edi,addrDest
cld // pour incrémenter EDI et ESI
@b1:
lodsd
shl eax,24
shr eax,24
stosd
cmp edi,lim
jne @b1
pop esi
pop edi
end;
( 16,1 secondes pour 1000 boucles )

Il est surprenant de constater que le source le plus court en ligne ( 3 lignes pour la boucle ) est le plus long à l'exécution !!!

On pourrait discuter encore longtemps sur le sujet, mais on va finir me dire que le site est un site Delphi et non assembleur... Ton source à de toute façon sa place ici, car c'est la seule manière d'avoir une procédure optimisée. Il suffit de regarder dans les sources des unités de Delphi pour voir que l'assembleur est très présent...

Bonne continuation.

Nono.
cs_cam91 Messages postés 19 Date d'inscription dimanche 9 juin 2002 Statut Membre Dernière intervention 4 février 2006
1 juil. 2002 à 00:29
Merci pour tous vos commentaires, surtout à nono40 qui semble vraiment bien maitriser l'assembleur intégré.
Quant à fabiin, je suis désolé mais je ne maitrise pas du tout l'anti-aliasing, je sais à peine de quoi il s'agit!
J'ai tenu à mettre cette source sur le site de Delphi pour montrer l'importance et la simplicité de l'assembleur intégré.
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
28 juin 2002 à 13:31
euh... Y a quand même un site assembleur, maintenant...
Pasque moi, j'y comprends rien !!!

Mais c'est toute fois assez intéressant à utiliser !
Bye !
fabiin Messages postés 329 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 8 décembre 2009 6
28 juin 2002 à 09:35
tès interessant !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.