Правильно ли загружать текстуры openGL вот так? - PullRequest
3 голосов
/ 28 января 2010

Я начал несколько месяцев назад проект OpenGL, который становился все больше и больше ... Я начал с примера crashLanding и использую Texture2D.

Я также использую одноэлементный класс для загрузки своих текстур, и вот как выглядит загрузка текстур:

//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];

и т. Д. Для почти 50 фотографий

Хорошо работает на 3GS, но иногда возникают проблемы с 3G.

Я не прав со всем этим?

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Вещи, которые вам нужно учитывать:

  • iPhone работает только с текстурами, которые имеют размерность степени 2 - если ваши текстуры не имеют таких размеров, и они все еще работают, это означает, что они изменяют размер с помощью программного обеспечения - это занимает время и больше важна ценная текстура памяти.
  • В iPhone есть видеопамять для 3 текстур размером 1024x1024 - вам может не хватить памяти текстур.
  • переключение текстур во время рендеринга медленное ... очень медленное. Чем меньше вы переключаете текстуры, тем лучше - в идеале, создавать не более 3 текстур и переключать их не более 3 раз
  • Для этого вам нужно освоить технику, называемую Texture Atlasing
1 голос
/ 28 января 2010

Возможно, вам не хватает текстурной памяти, что неудивительно если вы считаете, что используемый вами класс, вероятно, дополняет ваше изображение до степени 2 измерения.

Вы можете лучше использовать текстурную память, комбинируя свои спрайты в так называемый атлас спрайтов.

...