2012-12-11 2 views
1

나는 OpenGL ES를 사용하여 UIView에 YUV420 비디오를 표시하고 있습니다. 나는이 스레드 (CADisplayLink OpenGL rendering breaks UIScrollView behaviour)를 따라 30fps를 달성했다. 모든 것이 괜찮은 것 같습니다. 재생이 원활합니다. 지금은 악기를 통해 내 응용 프로그램을 실행하는 생각 나는 몇 가지 경고를 얻을 :openGL ES 경고

  1. 논리적 버퍼로드 - 개요 => 느린 프레임 버퍼 부하 텍스처에
  2. GPU 대기 - 텍스처 업로드
  3. 에 GPU에 대한 요약 => CPU 대기를

    [EAGLContext setCurrentContext:_context]; 
    glClear(GL_COLOR_BUFFER_BIT); 
    
    // load the color components into OpenGL 
    glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_Y]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frameWidth, frameHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (UInt8*)yuvFrame.luma.bytes); 
    
    glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_U]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frameWidth/2, frameHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (UInt8*)yuvFrame.chromaB.bytes); 
    
    glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_V]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frameWidth/2, frameHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (UInt8*)yuvFrame.chromaR.bytes); 
    
    // draw 
    glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_SHORT, 0); 
    [_context presentRenderbuffer:GL_RENDERBUFFER]; 
    
    -
  4. 텍스처 업로드 최적이 아닌 GPU 활용 요약 => 중간 프레임 질감은 내가 다음을 수행 내 콜백에서

을 업로드

그리고이 호출에의 UIViewinit 방법으로,이 같은 일부 PARAMS를, 텍스처를 생성하고 설정 이전 :

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_BLEND); 

glGenTextures(NUM_TEXTURES, _textures); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_Y]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glUniform1i(_uniformSamplers[SAMPLER_Y], TEXTURE_Y); 

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_U]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glUniform1i(_uniformSamplers[SAMPLER_U], TEXTURE_U); 

glActiveTexture(GL_TEXTURE2); 
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_V]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glUniform1i(_uniformSamplers[SAMPLER_V], TEXTURE_V); 

내가 재생 꽤 잘 수행 할 것으로 보인다 말했듯이, 나는 것, 비록 그러한 경고를 고치려고합니다. 나는 성공하지 못한 채 여러 가지 일을 시도했다. 내가 그들을 제거 할 수 있었던 유일한 방법은 나의 콜백의 시작/결말에 glGenTextures(NUM_TEXTURES, _textures)/glDeleteTextures(NUM_TEXTURES, _textures)를 호출하는 것이었지만 그것이 올바른 방법이라고 생각하지 않는다.

누구에게 의견이 있습니까?

답변

0

귀하의 목록에있는 첫 번째 경고는 때로는 Instruments에서 오 탐지 될 수 있으므로 실제 문제가 아닐 수도 있습니다. 그러나 프레임 버퍼의 이전 상태를 올바르게 지우지 않았다고 표시 할 수 있으므로 GL_COLOR_BUFFER_BIT 외에도 지워야 할 깊이 버퍼가 없는지 확인할 수 있습니다.

다른 두 개는 단순히 각 프레임에 glTexImage2D()을 통해 이미지 데이터를 업로드하는 데 시간이 걸린다는 것을 알려줍니다. iOS 5.0에서이 작업을 수행하는 경우 텍스처 캐시를 사용하여 업로드 프로세스 속도를 높일 수 있습니다 (CVOpenGLESTextureCacheCreate() 및 친구들). 그들은 당신이 약간의 여분의 성능을 짜내는 것을 도울 것입니다.

+0

감사합니다. 나는 CVOpenGLESTextureCacheCreate()를 살펴볼 것이다. 걱정할 가치가있는 경고라고 생각하십니까? 또한, 왜 glGenTextures (NUM_TEXTURES, _textures)/glDeleteTextures (NUM_TEXTURES, 각 도면의 시작/끝 부분에 _textures)를 할 때 경고가 사라지는 지 궁금합니다. – Glauco

+0

@Glauco - 컴파일러 경고와 같지 않습니다. 잠재적 인 성능 향상 영역에 대한 제안입니다. 내가 말했듯이, 때로는 오탐 (false positive)이 될 수도 있고 전혀 문제가되지 않을 수도 있습니다. 성능이 좋고 더 이상 조정할 필요가 없다면 안전 할 수 있습니다 이것들을 무시할 때. –