Buffer directx

cs_mana Messages postés 22 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 12 avril 2012 - 3 déc. 2009 à 18:36
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 15 déc. 2009 à 09:17
bonjour,
je travail avec des image dont l'adresse est un pointeur directx(dans la ram du pc , pas cette de la carte vidéo), mais l'accès a la mémoire est très lente.
il y a t-il une possibilité d'accélérer la lecture et l'écriture de cette zone mémoire .


sur mon pc la copie du zone mémoire (800*600*32) vers une autre zone mémoire met 2 ms contre 200ms d'une zone 'directx' vers une mémoire que j'ai réservé
merci.

3 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 déc. 2009 à 14:58
salut,

c'est louche ton truc.

A moins que la zone mémoire ne soit pas dans le cache il est étonnant de retrouver des valeurs de chrono aussi différentes.

quelles sont les valeurs des pointeurs ? Cela te permettra déjà de determier dans quelle partie de la mémoire ils se trouvent.

la mémoire se retrouve peut-être en swap.

La mémoire où tu ecris, elle est réservée ou allouée ?

@++
0
cs_mana Messages postés 22 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 12 avril 2012
9 déc. 2009 à 19:21
bonjour,

je ne sais pas si la mémoire est réservée ou allouée, je récupère juste
l'adresse du buffer.
(ps : c'est quoi la différence entre réservée ou allouée)

la valeur des pointeurs sont :
00B0xxxx
056xxxxx

c'est surtout la lecture de ses zones mémoires qui sont très lente
(l'asm ni change rien)

voici ce que j'utilise comme programme (ne pas se fié à la syntaxe)

cette fonction est tres lente(plus de 200ms pour une image de 800x600)
void copy_image_ram(){
int img=new[long,haut]
memcpy(img,bufdx,(long*haut))
}


(2 ms pour cette fonction)
void gris(img){
mov esi,long*hhaut
mov ebx,img
boucle
mov eax,[ebx]
//rgb=(r+g+b)/3
mov [ebx],eax
add ebx,4
sub esi,1
jne boucle
}


(10 ms pour celle-ci)
void copy_image_buf(){
mov eax,bufdx
mov ebx,img
mov esi,long*hhaut
boucle
mov [ebx],[eax]
add eax,4
add ebx,4
sub esi,1
jne boucle
}
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
15 déc. 2009 à 09:17
re,

Quand la mémoire est réservée, elle est allouée en emplacement virtuel uniquement. Quand elle est allouée, elle l'est physiquement.

Verifie lorsque tu alloue ton buffer si il n'y aurait pas un flag qui permettrait de mettre la mémoire en non discardable ou autres...

tu peux également tenter un gestionnaire d'exception car il ne m'étonnerait pas que des exceptions type PAGE_NOT_PRESENT s'executent.

@++
0
Rejoignez-nous