在iphone上加载openGL游戏的屏幕?

在iphone上加载openGL游戏的屏幕?,iphone,opengl-es,Iphone,Opengl Es,我在iPhone的openGL中工作,虽然一切都很好,但在游戏的某些部分,我不得不等待一秒钟,因为这些部分使用了大量的精灵表。有没有办法为这些部分创建加载屏幕?或者有没有办法知道某个纹理是否已经用openGL加载完毕 编辑: 我使用此功能加载纹理: -(void)loadTexture:(NSString*)nombre { CGImageRef textureImage = [UIImage imageNamed:nombre].CGImage; if (textureImage == ni

我在iPhone的openGL中工作,虽然一切都很好,但在游戏的某些部分,我不得不等待一秒钟,因为这些部分使用了大量的精灵表。有没有办法为这些部分创建加载屏幕?或者有没有办法知道某个纹理是否已经用openGL加载完毕

编辑:

我使用此功能加载纹理:

-(void)loadTexture:(NSString*)nombre {

CGImageRef textureImage = [UIImage imageNamed:nombre].CGImage;
if (textureImage == nil) {
    NSLog(@"Failed to load texture image");
    return;
}

textureWidth = NextPowerOfTwo(CGImageGetWidth(textureImage));   
textureHeight = NextPowerOfTwo(CGImageGetHeight(textureImage));

imageSizeX= CGImageGetWidth(textureImage);
imageSizeY= CGImageGetHeight(textureImage);

GLubyte *textureData = (GLubyte *)calloc(1,textureWidth * textureHeight * 4); // Por 4 pues cada pixel necesita 4 bytes, RGBA

CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast );
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage);

CGContextRelease(textureContext);

glGenTextures(1, &textures[0]);

glBindTexture(GL_TEXTURE_2D, textures[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

free(textureData);


glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   

}

我通常会在游戏的某个部分加载我需要的纹理,例如,一个或两个1024x1024的纹理作为精灵表,对于大多数关卡来说已经足够了,但在某些关卡中,例如boss battles,我加载了大约5到6个纹理(boss很大,有大量不同的攻击)游戏一次加载所有这些纹理大约需要2到3秒。

因为你是同步加载纹理的,很明显,加载纹理的方法一完成就完成了

编辑/添加: 在代码中有几件事你应该避免/更改。这并不能真正解决你的实际问题,只是一个一般性的建议

第一:不要使用imageNamed加载纹理图像-这通常是个坏主意。使用imageWithContentsOfFile,因为它不会将您无论如何都不会重用的数据占用图像缓存

第二:一旦加载了一个纹理,苹果公司称之为“暖化纹理”(warming the texture)——基本上就是简单地使用该纹理进行快速、肮脏(甚至是屏幕外)的渲染。这样可以确保纹理完全可用,并且在执行第一次“真实”渲染时不会施加额外的惩罚。我们谈论的是几毫秒的惩罚,所以没有什么大问题,但值得注意

第三:尝试将纹理加载转移到应用程序处于空闲状态的位置(例如,在启动屏幕中等待用户输入),但在ApplicationIDFinishLaunching方法中不要这样做


下面是一个问题-为什么在渲染/在关卡内部加载纹理。为什么不预先加载您可能需要的所有内容?您最多可以使用24mb的纹理内存,而无需施加任何惩罚(好吧,减去fbo内存)。

如Till所述,由于您是同步加载纹理的,因此在“加载纹理”完成后将加载纹理

通过OpenGL在另一个线程中渲染到屏幕,而通过OpenGL加载可能会变得非常混乱

经常使用的黑客是在纹理加载之间更新屏幕:

  • 渲染0%屏幕
  • 负载纹理
  • 渲染10%屏幕
  • 负载纹理
  • 根据需要重复
  • 通过一点额外的工作,很容易生成一个包含加载时间信息的小表,因此“x%”接近真实值;)


    我们通常会自动执行此步骤,并在发布新版本之前执行“加载到”运行,在该运行中,我们会记录何时加载资源以及加载所需的时间。

    或者,您可以在加载纹理时简单地显示UIImageView动画。这有一个特殊的好处,在一个单独的威胁画。。。这是一种特殊情况,就像UIActivityIndicatorView(微调器)一样。我不确定苹果是如何在技术上实现这一点的,但它工作得很好

    唯一需要注意的是,您需要将加载的动画帧保存在单独的文件中,而不是在精灵工作表中


    由于您正在加载纹理(通过OpenGL),因此您应该知道代码何时完成。如何加载纹理?代码示例将非常有用。这个问题听起来很像你自己没有实现GL的东西。@Andreas:我在问题中添加了一些代码,希望现在更清楚。谢谢@直到:?。如果听起来很刺耳,我很抱歉-我不确定你是否可能使用了第三方引擎,因此不知道引擎盖下发生了什么。谢谢。关于如何使加载变得不那么烦人,可以在屏幕上绘制一个小的加载动画,并在我的方法加载完纹理后立即将其删除?或者任何其他建议?@Til:“为什么在渲染/在关卡内加载纹理。为什么不预先加载您可能需要的所有内容?你可以使用高达24mb的纹理内存,而无需施加任何惩罚(好吧,减去fbo内存)。“我最初习惯于在开始时预加载所有纹理……但每当我试图一次加载太多纹理时(我总共有大约10MB的.png纹理),应用程序就会将我踢出.我想一次预加载所有纹理,但我不知道如何。。。