Я разработал 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 вфоновый поток и уменьшить время процессора до подходящего значения?