나는 OpenGL ES를 사용하여 UIView
에 YUV420 비디오를 표시하고 있습니다. 나는이 스레드 (CADisplayLink OpenGL rendering breaks UIScrollView behaviour)를 따라 30fps를 달성했다. 모든 것이 괜찮은 것 같습니다. 재생이 원활합니다. 지금은 악기를 통해 내 응용 프로그램을 실행하는 생각 나는 몇 가지 경고를 얻을 :openGL ES 경고
- 논리적 버퍼로드 - 개요 => 느린 프레임 버퍼 부하 텍스처에
- GPU 대기 - 텍스처 업로드 에 GPU에 대한 요약 => CPU 대기를
- 텍스처 업로드 최적이 아닌 GPU 활용 요약 => 중간 프레임 질감은 내가 다음을 수행 내 콜백에서
[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];
-
을 업로드
그리고이 호출에의 UIView
의 init
방법으로,이 같은 일부 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)
를 호출하는 것이었지만 그것이 올바른 방법이라고 생각하지 않는다.
누구에게 의견이 있습니까?
감사합니다. 나는 CVOpenGLESTextureCacheCreate()를 살펴볼 것이다. 걱정할 가치가있는 경고라고 생각하십니까? 또한, 왜 glGenTextures (NUM_TEXTURES, _textures)/glDeleteTextures (NUM_TEXTURES, 각 도면의 시작/끝 부분에 _textures)를 할 때 경고가 사라지는 지 궁금합니다. – Glauco
@Glauco - 컴파일러 경고와 같지 않습니다. 잠재적 인 성능 향상 영역에 대한 제안입니다. 내가 말했듯이, 때로는 오탐 (false positive)이 될 수도 있고 전혀 문제가되지 않을 수도 있습니다. 성능이 좋고 더 이상 조정할 필요가 없다면 안전 할 수 있습니다 이것들을 무시할 때. –