:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Forums Hébergés :: > µLibrary

µLibrary Official µLibrary forum (English / Français)

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 28/06/2008, 19h59   #1
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par défaut Idee pour alleger la vram

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 :
Citation:

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
sdevilcry est déconnecté   Réponse avec citation

Publicité

Vieux 28/06/2008, 21h59   #2
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 226
Par défaut

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.
Brunni est déconnecté   Réponse avec citation
Vieux 29/06/2008, 14h17   #3
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par défaut

Merci brunni j'avais pas penser a ca

On s'y remet demain

merci encore !
sdevilcry est déconnecté   Réponse avec citation
Vieux 29/06/2008, 18h11   #4
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par défaut

hum en faite ça marche pas du tout..

j'ai voulu essayer quelque chose :

Citation:
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

Citation:
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 :

Citation:
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 :

Citation:
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 (Case memoire interdite, aurevoir)

Redit :
Citation:
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 :
Citation:
/* 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 :



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 :

Dernière modification par sdevilcry ; 30/06/2008 à 15h59.
sdevilcry est déconnecté   Réponse avec citation
Vieux 30/06/2008, 16h05   #5
sdevilcry
Membre
 
Date d'inscription: 02/05/2008
Messages: 22
Par défaut

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 :
Citation:
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

Dernière modification par sdevilcry ; 30/06/2008 à 16h28.
sdevilcry est déconnecté   Réponse avec citation
Vieux 30/06/2008, 16h46   #6
Noda
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: à montréal jusqu'au 4 mai, après retour en france ^^
Messages: 570
Par défaut

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.
__________________
http://nodadev.wordpress.com
Noda est déconnecté   Réponse avec citation
Vieux 30/06/2008, 16h49   #7
thoduv
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: ...
Messages: 1 464
Par défaut

Citation:
Envoyé par Noda Voir le message
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 !
Bon à savoir !
__________________
"S'il n'y a pas de solutions c'est qu'il n'y a pas de problème ..."
< mon devblog > ... < Lapinou Jumps ! - un jeu de plate-forme "vertical" avec un mignon petit lapin. >
thoduv est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
[Divers] PMP (Portable Game & Media Player) : La nouvelle console cheap! vgiant Articles 46 07/01/2010 13h46
NDS Créer un skin pour la Supercard GuZnaK Articles et Tutos 34 08/12/2007 22h24
NDS [TUTO] Convertir une vidéo pour Moonshell ! Dakiz le blanc Archives - Divers (NDS) 6 26/07/2007 20h56
Tutorial Gestion de trajectoire de tir ou de bille, les virgules fixes mises en pratique Bobby Sixkilla Tutoriels 5 14/11/2006 04h40


Fuseau horaire GMT +2. Il est actuellement 09h17.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince