【发布时间】:2009-11-12 18:11:07
【问题描述】:
我正在为 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战,我加载大约 5 或 6 个纹理(boss 很大,并且有大量不同的攻击),游戏一次加载所有这些纹理大约需要 2 或 3 秒。
【问题讨论】:
-
由于你正在加载纹理(通过OpenGL),你应该知道你的代码何时完成。你如何加载纹理?代码示例会很有帮助。
-
这个问题听起来很像你自己没有实现 GL 的东西。
-
@Andreas:我在问题中添加了一些代码,希望现在更清楚。谢谢。 @Till: ?.
-
对不起,如果这听起来很刺耳 - 我不确定您是否可能使用了某个 3rd 方引擎,因此不知道引擎盖下发生了什么。