3

几个月前我开始了一个越来越大的 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 上存在一些问题。

我错了吗?

谢谢

4

2 回答 2

3

您需要考虑的事项:

  • iPhone 仅适用于尺寸为 2 次方的纹理——如果你的纹理没有这样的尺寸,并且它们仍然有效,这意味着它们已被软件调整大小——这需要时间,更重要的是有价值的纹理记忆。
  • iPhone 有大约 3 个 1024x1024 大小的纹理的视频内存——你可能会用完纹理内存。
  • 在渲染过程中切换纹理很慢......非常慢。切换纹理越少越好——理想情况下,最多创建 3 个纹理,最多切换 3 次
  • 要实现这一点,您需要学习一种称为纹理图集的技术
于 2010-01-28T14:22:19.310 回答
1

您可能会用完纹理内存,如果您考虑到您正在使用的类可能会将您的图像填充到二维的幂,这并不奇怪。

通过将精灵组合成所谓的精灵图集,您可以更好地使用纹理内存。

于 2010-01-28T14:08:17.260 回答