我使用iOS上的Opengles3开发了一个Opengles,我已经阅读了《 OpenGL ES编程指南》。《 OpenGL ES编程指南》中引入的许多技术专门用于创建具有出色CPU-GPU并行度的OpenGL应用程序,这意味着CPU时间显示OpenGL帧缓冲区时,它几乎等于GPU时间。
因此,我创建了一个示例Opengles演示,在NewOpenGLView.m中自定义一个UIView类以显示名为NewOpenGLView的Opengles内容,然后创建一个CADisplayLink对象以显示渲染内容。
-(void)createDisplayLink{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkMethod)];
self.displayLink.preferredFramesPerSecond = 30;
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
-(void)displayLinkMethod{
[self render];
}
-(void)render
{
glClearColor(0.3, 0.5, 0.8, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, openGLSize.width, openGLSize.height);
glEnable(GL_DEPTH_TEST);
glUseProgram(_programHandle);
[self setupProjectionMatrixAndModelViewMatrix];
[self drawFirstCube];
[self drawSecondCube];
[self drawThirdCube];
glUseProgram(_textureProgram);
[self setupTextureProjectionMatrixAndModelViewMatrix];
[self drawTextrue];
[_context presentRenderbuffer:_colorBuffer];
}
“显示调试导航器”窗口显示fps为30,CPU时间为0ms,GPU时间约为1ms,看来我的Opengles应用程序性能相当不错,我知道render方法应该在后台线程上运行为了获得更好的UI性能,所以我创建了一个后台线程来运行render方法,因此我更改了displayLinkMethod代码:
-(void)displayLinkMethod{
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
if (testBool == false) {
[EAGLContext setCurrentContext:_context];
}
testBool = true;
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
[self render];
dispatch_semaphore_signal(signal);
});
}
更改displayLinkMethod代码后,Opengles内容可以正确显示,但CPU时间增加到33ms,GPU时间减少到0ms,我认为CPU时间不合适,这让我感到困惑,我该怎么办?我想在后台线程中运行render方法并将CPU时间减少到合适的值怎么办?