OpenGLES использует много процессорного времени, когда я рендую его в фоновом потоке - PullRequest
0 голосов
/ 24 июня 2019

Я разработал Opengles, использую Opengles3 на iOS, я читал Руководство по программированию OpenGL ES. Многие методы, представленные в Руководстве по программированию OpenGL ES, нацелены специально на создание приложений OpenGL, которые демонстрируют великолепную параллельность CPU-GPU, то есть время CPUпри отображении кадрового буфера OpenGL почти равно времени GPU.

, поэтому я создаю демонстрационную демонстрацию Opengles, настраиваю класс UIView для отображения содержимого Opengles с именем NewOpenGLView, в NewOpenGLView.m создаю объект 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];  
}  

в окне «Показать отладочный навигатор» показано, что частота кадров равна 30, а время процессора равно 0 мс, а время графического процессора - около 1 мс. Кажется, производительность моего приложения Opengles довольно хорошая, язнать, что метод рендеринга должен выполняться в фоновом потоке для лучшей производительности пользовательского интерфейса, поэтому я создаю фоновый поток для запуска метода рендеринга, поэтому я изменяю код 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Опенглс content может показывать правильное значение ar раньше, но время CPU увеличивается до 33ms, время GPU уменьшается до 0ms, я думаю, что время CPU не подходит, это меня смущает, что мне делать, если я хочу запустить метод render вфоновый поток и уменьшить время процессора до подходящего значения?

...