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

Soyez le premier à donner votre avis sur cette source.

Vue 5 866 fois - Téléchargée 615 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_CALAMS
Messages postés
4
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
3 janvier 2009
-
BRAVO
cs_cam91
Messages postés
19
Date d'inscription
dimanche 9 juin 2002
Statut
Membre
Dernière intervention
4 février 2006
-
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
1 -
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
-
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
871
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1 -
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 !

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.