1

Pour afficher les frames de mon codec video fait "maison", j'utilise une fonction de blit de surface. De nombreux forums recommandent le blit de surface pour sa rapidité d'execution.
Je crée donc une surface temporaire, je la rempli avec les données "pixels", et je la blitte sur ma surface "screen", mais c'est tres lent ! environ 5 frames/secondes.
Voici un extrait de mon code - la fonction incluant le blit-, peut etre aurez vous des suggestion pour optimiser la vitesse d'execution ...


//screen = SDL_SetVideoMode(320, 240, 24, SDL_HWSURFACE | SDL_HWACCEL);
//tempKouky->kouky = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_HWACCEL,320,240,24,0xff0000, 0x00ff00, 0x0000ff, 0x000000);
//tempKouky->koukyData = new unsigned char[320*240*pitchh];
#
SDLKouky *renderKouky()
{

unsigned short pitchh=3;

for (map_y=crop;map_y<240/8-crop; map_y+=1)
{
for (map_x=crop;map_x<320/8-crop; map_x+=1)
{

for (j = 0; j < 8; j++)
{
for (i = 0; i < 8; i+=1)
{
tempKouky->koukyData[((j+8*map_y)*320 + (i+8*map_x))*pitchh+0] = palR[ 256*track + Tiles[ MEM_TILES*track + (64*Map[ 60000*2*track + 1200*(tps-1)+map_y*320/8+map_x])+(8*j+i) ] ];
tempKouky->koukyData[((j+8*map_y)*320 + (i+8*map_x))*pitchh+1] = palG[ 256*track + Tiles[ MEM_TILES*track + (64*Map[ 60000*2*track + 1200*(tps-1)+map_y*320/8+map_x])+(8*j+i) ] ];
tempKouky->koukyData[((j+8*map_y)*320 + (i+8*map_x))*pitchh+2] = palB[ 256*track + Tiles[ MEM_TILES*track + (64*Map[ 60000*2*track + 1200*(tps-1)+map_y*320/8+map_x])+(8*j+i) ] ];
}
}
}
}

tempKouky->kouky->pixels = tempKouky->koukyData;

SDL_Rect dest;
dest.x = crop*8;
dest.y = crop*8;
//futile?
dest.w = 320-2*crop*8;
dest.h = 240-2*crop*8;
//
SDL_Rect src;
src.x = crop*8;
src.y = crop*8;
src.w = 320-2*crop*8;
src.h = 240-2*crop*8;
SDL_BlitSurface(tempKouky->kouky, &src, screen, &dest);

}
#

2

Salut,

Ta surface est ,d'apres ce que je peut voir, en 24 bits, essai de la passer en 16 tu evitera je pense des convertions à la volé.
De plus le blit dans le SDL est en soft , sauf si tu utilise le SDL adapté Hardware, vérifi que tu ai bien celui ci.

je remarque aussi que tu fait des acces à des tables pour tes convertions RGB, cela ralentit surement.

Il faut savoir que les acces mémoire sont pas le point fort de la GP2X.

voila.

avatar

3

il y a eut un topic dans le meme genre sur gp32x et comme la dit UKKO la GP2x a un affichage 16bits par defaut donc si tu envoi dut 24bits il est olbige de faire de la transformation et donc de la perte de temps wink le mieux pour la GP2x c'est du 16bits ou 8bits.

voir pour le prob d'affichage RGB 24bits: http://www.gp32x.com/board/index.php?showtopic=31433
SDL et ecran 24bits:
http://www.gp32x.com/board/index.php?showtopic=31409

4

En regardand de plus pres ton code on peut voir que tu fais 691200 acces mémoire en lecture par frame , c'est enorme !!
essais de reduire les acces memoire au maximun dans tes boucles.

Tu fais aussi 230400 divisions sad
avatar

5

Merci pour ces infos, je vais essayer d'optimiser tout ca !

a propos du SDL adapté hardware, je ne sais pas si je l'utilise...
Je travaille mon projet avec le logiciel officiel de gp2x.com

6

Donc non, tu le l'utilise pas. Pour la télécharger, regarde sur gp32x. Mais il ne faut pas croire que ça arrangera tous, je pense que la meilleures solution pour toi c'est d'optimiser smile

7

existe t'il un moyen plus rapide qu'une boucle FOR pour effectuer la meme opération que :

koukyData[a+0]=Pal[b+0];
koukyData[a+1]=Pal[b+1];
koukyData[a+2]=Pal[b+2];
koukyData[a+3]=Pal[b+3];
koukyData[a+4]=Pal[b+4];
koukyData[a+5]=Pal[b+5];
koukyData[a+6]=Pal[b+6];
koukyData[a+7]=Pal[b+7];

?
Est il possible de copier les huit valeurs d'un seul coup ?

j'ai cherché du coté de memcpy, mais sans trouver de possibilité ce copier un morceau de tableau au milieu d'un autre tableau...

8

Effectivement tu peux copier huit valeurs à la fois si tu le fais en assembleur ^^


LDMIA r0!,{r2-r9}
STMIA r1!,{r2-r9}

dans R0 tu as l'adresse de Pal
dans R1 tu as l'adresse de koukyData


tu ne trouveras pas plus rapide.
avatar

9

pour copier un nombre variable de valeurs:

memcpy(&Pal[b],&koukyData[a],leNombreDoctetsACopier);