Правилно ли е да се зареждат openGL текстури като тази?

Започнах преди няколко месеца OpenGL проект, който ставаше все по-голям и по-голям... Започнах с пробата crashLanding и използвам Texture2D.

Също така използвам клас singleton за зареждане на моите текстури и ето как изглежда зареждането на текстурата:

//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.

Греша ли с всичко това?

Благодаря


person ipodishima    schedule 28.01.2010    source източник


Отговори (2)


Може да ви изчерпва паметта за текстури, което не е изненадващо, ако вземете предвид, че класът, който използвате, вероятно увеличава изображението ви до степен на 2 измерения.

Можете да използвате паметта на текстурата по-добре, като комбинирате вашите спрайтове в така наречения атлас на спрайтове.

person Rhythmic Fistman    schedule 28.01.2010

Неща, които трябва да имате предвид:

  • iPhone работи само с текстури, които имат размери на степен 2 -- ако вашите текстури нямат такива размери и все още работят, това означава, че са преоразмерени от софтуера -- това отнема време и по-важното - ценна текстура памет.
  • iPhone има видео памет за около 3 текстури с размер 1024x1024 -- може да ви свърши паметта за текстури.
  • превключването на текстури по време на рендиране е бавно... изключително бавно. Колкото по-малко превключвате текстури, толкова по-добре – в идеалния случай създайте най-много 3 текстури и ги превключвайте най-много 3 пъти
  • за да постигнете това, трябва да научите техника, наречена атласиране на текстури
person Kornel Kisielewicz    schedule 28.01.2010
comment
Благодаря на вас двамата, Rhythmic Fistman и Kornel Kisielewicz. Да, моите текстури са преоразмерени, за да паснат на 256x256 или по-малко. Така че основно, с текстурния атлас, поставям всичките си изображения в едно и след това зареждам този огромен атлас (или някои, ако е твърде голям). След това ще създам масив, който съдържа позициите на всяка част от този атлас и ще пренапиша част от моя метод за рисуване. Греша ли ? - person ipodishima; 28.01.2010
comment
@ipodishima - и да, и не -- правите го максимум 1024x1024, така че винаги го зареждате изцяло в паметта за текстури. Между другото, ако оценявате Rhythmics и моя отговор, не забравяйте да гласувате за тях -- така работи SO :). - person Kornel Kisielewicz; 28.01.2010
comment
Да, сега имам достатъчно репутация, за да гласувам! Това, което наистина ме ядосва, е, че работи добре на iPod Touch или 3GS. Също така се опитах да използвам shareGroup, но това не работи, дисплеят е като част от данните на графичен буфер. Наистина странно. Не мога да разбера защо. Всъщност, ако трябва да пренапиша как показвам изображенията си, може би трябва да използвам Cocos2D. Освен това кодът ми за рендиране е около 2000 реда и това е първият ми OpenGL проект (трябваше да е много прост, но трябваше да добавям още и още нива...) - person ipodishima; 28.01.2010