J'ai une application OpenGL ES pour l'iPhone que je développe, étant un port d'une application orientée 2d à partir d'une autre plateforme. J'ai choisi de rendre les graphiques en utilisant OpenGL ES pour des raisons de performances. Cependant, l'application principale fonctionne sur un thread séparé (en raison de la conception de l'application d'origine), donc à partir de mon délégué application que je fais:Comment mettre à jour la mise à jour du contexte iPhone OpenGL ES tout de suite?
- (void) applicationDidFinishLaunching:(UIApplication *)application {
CGRect rect = [[UIScreen mainScreen] bounds];
glView = [[EAGLView alloc] initWithFrame:rect];
[window addSubview:glView];
// launch main application in separate thread
[NSThread detachNewThreadSelector:@selector(applicationMainThread) toTarget:self withObject:nil];
}
Cependant, je remarque que tous les appels dans le applicationMainThread qui tentent de rendre quelque chose à l'écran ne rend rien, jusqu'à ce que ce thread se termine.
Je configure le contexte OpenGL ES réel sur le thread d'application enfant, pas le thread UI. Si je fais ceci:
- (void) applicationMainThread {
CGRect rect = [[UIScreen mainScreen] bounds];
[glView createContext]; // creates the open GL ES context
//Initialize OpenGL states
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glMatrixMode(GL_PROJECTION);
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);
Texture2D *tex = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"iphone_default.png"]];
glBindTexture(GL_TEXTURE_2D, [tex name]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glDisable(GL_BLEND);
[tex drawInRect:[glView bounds]];
glEnable(GL_BLEND);
[tex release];
[glView drawView];
}
Puis la texture est mise à jour à l'écran presque immédiatement, comme je m'attendais.
Cependant, si après la [GLView drawView] appeler ajouter cette seule ligne:
[NSThread sleepForTimeInterval:5.0]; // sleep for 5 seconds
L'écran est mis à jour après que le délai de 5 secondes se termine. Cela m'amène à croire que l'écran ne se met à jour que lorsque le thread se termine (il faut faire plus de tests pour confirmer). Cela signifie que lorsque je substitue le code d'application réel, qui fait plusieurs mises à jour d'écran, aucune des mises à jour n'arrive (laissant un écran blanc) jusqu'à ce que le thread d'application se termine, pas exactement ce que je voulais! Donc, y a-t-il un moyen de contourner ce problème ou est-ce que j'ai fait quelque chose qui ne va pas?
Pouvez-vous nous montrer ce qu'il y a dans votre 'glView :: drawView'? – zoul
- (void) drawView { [EAGLContext setCurrentContext: contexte]; glBindRenderbufferOES (GL_RENDERBUFFER_OES, viewRenderbuffer); [contextRenderbuffer de contexte: GL_RENDERBUFFER_OES]; } – Gabriel
Salut compatriote Sunshine Coast dev! – alex