Exemple d'utilisation de setdibitstodevice

0/5 (31 avis)

Vue 8 184 fois - Téléchargée 565 fois

Description

Cette source a pour but d'expliquer une utilisation simple de SetDIBitsToDevice. Cette fonction est très utile pour accélérer l'affichage de pixel à l'écran (au lieu de SetPixel par exemple). Il y a quelque sources de librairie graphique sur ce site (MGraphics par exemple). MGraphics utilise SetPixel et malheureusement, c'est très lent. J'ai fait ma propre librairie graphique moi aussi (et ça n'a pas été facile croyez moi) mais elle utilise SetDIBitsToDevice et je peux vous garantir que la différence de vitesse est incroyable.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
53
Date d'inscription
jeudi 31 juillet 2003
Statut
Membre
Dernière intervention
28 mars 2007

Bonjour,

Moi je comprends pas pourquoi define BYTEWIDTH = 4*((3*TABWIDTH+3)/4) c'est a dire (TABWIDTH*3)+3.

Pourquoi + 3 ?

Qqn peut m'expliquer ?

Merci
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
La dernière deja?!? C'est pas grave. C'est déja bien gentil de ta part de me consacrer ce temps. Merci bien. Bon allez. C'est la dernière mise à jour après moi aussi je passe à autre chose. Voila j'ai corriger la fonction myZeroMemory. C'est maintenant celle de BruNews. Plus grosse mais plus rapide.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
28
Allez une dernière:

myZeroMemory() boucle autant de tours que d'octets, pas terrible, il faut dérouler afin de faire le moins de sauts de code possible, c'est le plus pénalisant pour les perfs.

Exemple avec 8 octets (2 DWORDs) par tour:
__declspec(naked) void __fastcall bnZeroMemory(void *destination, UINT size)
{ // ECX destination, EDX size
__asm {
test edx, edx
mov eax, edx
je short zeroEXIT
and eax, 7
sub edx, eax
jz short finHUIT
parHUIT:
mov dword ptr[ecx], 0
mov dword ptr[ecx+4], 0
add ecx, 8
sub edx, 8
jnz short parHUIT
finHUIT:
test eax, eax
je short zeroEXIT
parUN:
mov byte ptr[ecx], 0
inc ecx
dec eax
jnz short parUN
zeroEXIT:
ret 0
}
}
Messages postés
16
Date d'inscription
mercredi 10 novembre 2004
Statut
Membre
Dernière intervention
13 août 2007

Merci à toi BruNews.
Désolé SAKingdom, je me suis égaré quand j'ai vu qu'on parlait d'optimisation.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Bon j'ai apporté les optimisations que BruNews ma suggéré. J'ai aussi remplacé ma fonction mymemset par myZeroMemory. Elle est en assembler. Ensuite, pour MickCo:

lpBits[tmp]=bluelevel;
lpBits[tmp+1]=greenlevel;
lpBits[tmp+2]=redlevel;
tmp += 3;

Le but de cette source est en partie d'expliquer comme le calcule des positions dans le buffer s'effectue. Si je fais tmp += 3, sa reviend à expliquer une méthode pour dessiner des rectangles. Hors avec ce que j'explique et avec un peut d'imagination, on peut tout faire avec ça même du 3D.
Afficher les 31 commentaires

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.