我有一個用於iPhone的OpenGL ES應用程序,我正在開發,作爲另一個平臺的面向2D應用程序的端口。出於性能考慮,我選擇使用OpenGL ES來渲染圖形。然而,主要應用在單獨的線程上運行(由於原來的應用程序設計),所以從我的應用程序委託中我這樣做:如何使iPhone OpenGL ES上下文更新直接消失?
- (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];
}
然而,我注意到,試圖呈現applicationMainThread內的任何電話屏幕上的東西不會渲染任何東西,直到該線程終止。
我在子應用程序線程上設置了實際的OpenGL ES上下文,而不是UI線程。如果我這樣做:
- (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];
}
然後紋理幾乎立即更新到屏幕,正如我所期望的。
然而,如果之後的[glView drawView函數]調用我添加這一行:
[NSThread sleepForTimeInterval:5.0]; // sleep for 5 seconds
然後5秒延遲完成後的畫面僅更新。這使我相信只有在線程本身終止時纔會更新屏幕(需要進行更多測試以確認)。這意味着當我用實際的應用程序代碼替換多個屏幕更新時,實際上沒有任何更新發生(留下白色屏幕),直到應用程序線程退出,而不是我想要的!
那麼 - 有沒有什麼辦法可以解決這個問題,還是我做了一件明顯錯誤的事情?
你能告訴我們你的'glView :: drawView'裏面有什麼嗎? – zoul 2009-12-31 09:35:49
- (void)drawView {EAGLContext setCurrentContext:context]; glBindRenderbufferOES(GL_RENDERBUFFER_OES,viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; } – Gabriel 2009-12-31 15:35:15
你好同伴陽光海岸開發! – alex 2010-09-24 00:45:45