PDA

Voir la version complète : [µLibrary][Aide] Idee pour alleger la vram


sdevilcry
28/06/2008, 20h59
Salut tout le monde, voila avec mon groupe de projet on a toujours de gros probleme avec la vram ... bref je vais vous expliquer pourquoi.

Au début, on charger en ram des images de 16xx*12xx (me souviens plus exactement combien) et on créer une map avec ça, on arriver a afficher la map mais des qu'on voulais afficher un sprite en plus, bah c'était fini..

J'ai donc eu l'idée de réduire la map et le sprite, on est donc passer a une image de 512 * 512 et d'un sprite de 16*16 au lieu de 32*32. Comme tout est en puissance de 2 ça allège le total :)

Ce qui bloque :

J'ai créer une image qui me prendra tout l'écran tu haut afin de m'en servir en tant qu'inventaire, le problème, si je blite en même temps l'image dans l'ecran du bas l'image de 512 * 512, l'une des deux ne s'affichera pas ...

L'idee :

C'est de charger en ram l'image de 512*512, et de creer une image simple de 256*191 en vram, avec laquelle je vais faire une copie en memoire d'un pointeur sur l'autre, donc utiliser un memcpy :)

Le soucis est qu'on a du mal a comprendre comment brunni a stocker l'image en ram et comment on pourrai récupérer les donner nécessaire que l'on veut copier sur notre pointeur temporaire afin d'afficher une partie d'image désirer :)

exemple :


var->toscale = ulLoadImageFilePNG("map.png", 0, UL_IN_RAM, UL_PF_PAL8);
var->bg = ulCreateImage(256, 191, UL_IN_VRAM, UL_PF_PAL8, 8);
memcpy(var->bg, var->toscale, 256*191);
var->inv.bg = ulLoadImageFilePNG("inventaire.png", 0, UL_IN_VRAM, UL_PF_PAL8);


Mais ceci ne marche pas :'(

J'espère que j'ai été compréhensible :)

merci de votre soutiens

Brunni
28/06/2008, 22h59
Si ton image fait 512x512, alors en mémoire c'est un tableau de 512 lignes de 512 pixels, les lignes étant à la suite les unes des autres.
Forcément si copies 256 * 191 avec memcpy tu copies 48896 octets, c'est à dire que comme chaque pixel fait 1 octet (8 bits) 48896 pixels. Comme chaque ligne fait 512 pixels tu copies en fait 95.5 lignes de l'image source vers l'image destination. Problème: l'image de destination n'a pas la même largeur, donc imaginons que l'image source fait en fait 8 pixels et l'image de destination 4, en copiant l'image suivante:
0 1 2 3 4 5 6 7
8 9 a b c d e f
Tu auras sur l'image destination:
0 1 2 3
4 5 6 7
8 9 a b
c d e f
Ce qui n'est certainement pas ce que tu veux. Tu dois plutôt copier l'image ligne par ligne, en prenant soin de sauter les 256 pixels à droite de chaque ligne qui ne te servent à rien.

sdevilcry
29/06/2008, 15h17
Merci brunni j'avais pas penser a ca :)

On s'y remet demain :)

merci encore !

sdevilcry
29/06/2008, 19h11
hum en faite ça marche pas du tout..

j'ai voulu essayer quelque chose :

var->toscale = ulLoadImageFilePNG("map.png", 0, UL_IN_RAM, UL_PF_PAL8);
var->bg = ulCreateImage(1, 1, UL_IN_VRAM, UL_PF_PAL8, 8);

ensuite je fait

var->bg[0] = var->toscale[0];

il m'affiche sur l'écran du bas toute la map, alors qu'il devrait m'afficher qu'un pixel nan ?

Maintenant si je fait :

var->bg[0] = var->toscale[1];

Ca plante, je comprend vraiment pas pourquoi..

Mon image est toujours en 512*512 en 8 bits format png.

J'ai essayer de voir dans ton drawing.c comment tu allouer la mémoire et je vois que tu fais comme ca :

if (location == UL_IN_RAM) {
int size = (ul_pixelSizes[format] * img->sysSizeX * img->sysSizeY) >> 3;
img->texture = malloc(size);
Ce n'est pas dans img->texture qu'il faudrait que je tape ?

Autre question (j'essay de vraiment comprendre comment sont stocker les donner en ram et vram de la ds)

size = (ul_pixelSizes[format] * img->sysSizeX * img->sysSizeY) >> 3;

Pourquoi réduire la taille de (2^3) ?

car au final ca donnerai size = (8 * size_x * size_y) / 2^3; nan ?

Edit : j'ai compris pourquoi ca segfaulter quand je faisait : var->toscale[1], vu que UL_IMAGE est une struct il n'y a qu'une adresse en memoire de cettre structure, du coup c'est pas vraiment la bonne valeur a taper :p (Case memoire interdite, aurevoir)

Redit : car au final ca donnerai size = (8 * size_x * size_y) / 2^3; nan ?Je pense que du divise par 8, car 8 bits >: 1 octet nan ?

J'ai commencer a avoir un leger rendu au niveau de la copi en etudiant la lib png, masi c e4st pas encore ca, j;ai du oublier un detail, :s

voici le bout de code :
/* fill the bg in good position */
void scale_image(t_quest *var)
{
int x;
int y;
u8 *p_src = (u8*)var->toscale->texture;
u8 *p_dest = (u8*)var->bg->texture;

for (y = 0; y < 191; ++y)
{
for (x = 0; x < 256; ++x)
{
p_dest[x] = p_src[x];
//((char *)var->bg->texture)[((y * x) + x)] = *p_dest;
//var->bg[x * y] = tmp[pos];
}
p_dest += ((var->toscale->sysSizeX * 8) >> 3);
p_src += ((var->bg->sysSizeX * 8) >> 3);
}
}

apercu en image :

http://www.blog-vince.fr/apercu.jpg

Nouvel edit :
Erreur de ma part, j'ai inverser les pointeur a ce niveau la :
p_dest += ((var->toscale->sysSizeX * 8) >> 3); deviens += ((var->bg->sysSizeX * 8) >> 3);
p_src += ((var->bg->sysSizeX * 8) >> 3); deviens += ((var->toscale->sysSizeX * 8) >> 3

nouvel apercu :
http://blog-vince.fr/apercu2.jpg

sdevilcry
30/06/2008, 17h05
juste un petit up pour qu'on voit que le post a été mis a jour ;)

Un ami a refait ma boucle de cette facon :

for (y = 0; y < 191; ++y)
{
memcpy(var->bg->texture + y * 256, var->toscale->texture + y * 512, 256);
}

meme resultat, je pense que ca doit venir de la palette maintenant :s

Noda
30/06/2008, 17h46
Juste pour signaler, la uLib a un bug dans la gestion des palettes: supprimer une palette de la mémoire moisit généralement les palettes chargées avant et/ou après celle supprimée. J'ai déjà fait remonter le bug à Brunni.

thoduv
30/06/2008, 17h49
Juste pour signaler, la uLib a un bug dans la gestion des palettes: supprimer une palette de la mémoire moisit généralement les palettes chargées avant et/ou après celle supprimée. J'ai déjà fait remonter le bug à Brunni.
Aaaaaaaaaaaah c'est çaaaaaaaaaaaaaaaa ! :w00t:
Bon à savoir ! :)