当我在后台线程中渲染时,Opengles使用了很多cpu时间

时间:2019-06-24 01:34:43

标签: ios opengl-es gpu cpu-usage

我使用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时间减少到合适的值怎么办?

0 个答案:

没有答案