2012-04-29 3 views
0

iOS OpenGL-es 앱에서 스레딩을 사용하는 방법을 배우고 있습니다. 나는 OpenGL은 게임 템플릿 코드 수정하려고 : 그것은 잘 작동한다면 그것은 fps 인에서 60 프레임에서 상자와 다른립니다glkview에서 dispatch_async를 사용하는 방법은 무엇입니까?

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindVertexArrayOES(_vertexArray); 

    // Render the object with GLKit 
    [self.effect prepareToDraw]; 

    glDrawArrays(GL_TRIANGLES, 0, 36); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     sleep(1); 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Render the object again with ES2 
      glUseProgram(_program); 

      glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
      glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

      glDrawArrays(GL_TRIANGLES, 0, 36); 
     }); 
    }); 
} 

을,하지만 난 위의 코드를 실행하면, 그것은 단지 하나의 박스를 그립니다.

웹을 검색 한 결과 문제의 원인을 찾을 수 없습니다.

도움을 주셔서 감사합니다.

답변

1

발송 블록의 코드가 작동하지 않습니다. 실행될 때까지는 해당 프레임에 대한 모든 OpenGL 상태가 오랫동안 파괴되었을 것입니다. 그 블록에 glGetError()를 호출하면, 똑같이 말할 것입니다. OpenGL 상태가 유효하도록 glkView 메소드에서 모든 그리기 코드가 완료되었는지 확인해야합니다. 이 디스패치를 ​​수행 할 때, 그 메소드의 범위 밖에서 그 드로잉 코드의 실행을 본질적으로 꺼 버린다.

+0

나는 여기에서 같은 문제를 우연히 발견했다. 이 대답은 절대적으로 정확합니다. 그러나 두 번째 스레드에서 드로잉을 수행 할 수있는 방법이 있습니까? –

관련 문제