2010-01-28 4 views
3

J'ai commencé il y a quelques mois un projet OpenGL qui est devenu de plus en plus important ... J'ai commencé avec l'exemple crashLanding et j'utilise Texture2D.Est-ce correct de charger des textures openGL comme ça?

J'utilise aussi une classe singleton pour charger mes textures, et voici ce que la charge de la texture ressemble à:

//Load the background texture and configure it 
_textures[kTexture_Background] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"fond.png"]]; 
glBindTexture(GL_TEXTURE_2D, [_textures[kTexture_Background] name]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

// Load the textures 
_textures[kTexture_Batiment] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"batiment_Ext.png"]]; 
_textures[kTexture_Balcon] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"balcon.png"]]; 
_textures[kTexture_Devanture] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"devanture.png"]]; 
_textures[kTexture_Cactus_Troncs] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"cactus-troncs.png"]]; 
_textures[kTexture_Cactus_Gauche] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"cactus1.png"]]; 
_textures[kTexture_Cactus_Droit] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"cactus2.png"]]; 
_textures[kTexture_Pierre] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"pierre.png"]]; 
_textures[kTexture_Enseigne] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"enseigne.png"]]; 
_textures[kTexture_Menu] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"saloonIntro.jpg"]]; 
_textures[kTexture_GameOver] = [[Texture2D alloc] initWithImage: [UIImage imageNamed:@"gameOver.jpg"]]; 

for (int i = 0 ; i < kNumTexturesScene ; i ++) 
{ 
    [arrayOfText addObject:[[[NSData alloc] init] autorelease]];  
} 
// sort my array 
for (int i = 0 ; i < kNumTexturesScene ; i ++) 
{ 
    [arrayOfText replaceObjectAtIndex:i withObject:_textures[i]]; 
} 

[dictionaryOfTexture setObject:[arrayOfText copy] forKey:kTextureDecor]; 
[arrayOfText removeAllObjects]; 

et ainsi de suite pour près de 50 photos

Il fonctionne bien sur le 3GS, mais il y a parfois des problèmes avec la 3G.

Ai-je tort avec tout cela?

Merci

Répondre

1

Vous économiserez ainsi de la mémoire de texture, ce qui est pas surprenant si vous considérez que la classe que vous utilisez probablement pads votre image sur la puissance de 2 dimensions.

Vous pouvez mieux utiliser la mémoire de texture en combinant vos sprites en un atlas appelé sprite.

3

choses que vous devez considérer:

  • iPhone fonctionne uniquement avec des textures qui ont des dimensions d'une puissance de 2 - si vos textures ne sont pas de telles dimensions, et ils fonctionne encore, cela signifie que ils sont redimensionnés par le logiciel - cela prend du temps, et plus important encore de la mémoire de texture précieuse.
  • L'iPhone dispose d'une mémoire vidéo pour environ 3 textures de taille 1024x1024 - vous risquez de manquer de mémoire de texture. La commutation des textures pendant le rendu est lente ... extrêmement lente. Moins vous changez de textures meilleurs - idéalement, créer au plus 3 textures, et les passer au maximum 3 fois
  • à atteindre que vous avez besoin d'apprendre une technique appelée texture atlasing
+0

Merci à vous deux, Rythmique Fistman et Kornel Kisielewicz. Oui, mes textures sont redimensionnées pour correspondre à 256x256 ou moins. Donc, en gros, avec un atlas de texture, je mets toutes mes images en une seule, et je charge ensuite cet énorme atlas (ou quelques unes si c'est trop grand). Ensuite, je vais créer un tableau qui contient les positions de chaque partie de cet atlas et réécrire une partie de ma méthode de dessin. Ai-je tort ? – ipodishima

+0

@ipodishima - oui et non - vous le faites au maximum 1024x1024 donc vous le chargez toujours complètement dans la mémoire de texture. BTW, si vous appréciez Rhythmics et la mienne réponse, n'oubliez pas de les upvote - c'est ainsi que fonctionne SO :). –

+0

Ouais j'ai maintenant assez de réputation pour voter! Ce qui m'énerve vraiment, c'est que cela fonctionne bien sur iPod Touch ou 3GS. J'ai également essayé d'utiliser shareGroup, mais cela ne fonctionne pas, l'affichage est comme un morceau de données d'un tampon graphique. Vraiment étrange. Je ne peux pas comprendre pourquoi. En fait, si je dois réécrire comment j'affiche mes images, peut-être devrais-je utiliser Cocos2D. De plus, mon code de rendu est d'environ 2000 lignes et c'est mon premier projet OpenGL (c'était censé être très simple mais j'ai dû ajouter de plus en plus de niveaux ...) – ipodishima

Questions connexes