2011-04-08 5 views
6

OpenGL에서 질감 삼각형 메쉬를 사용하여 전체 화면 배경을 그릴 때보기 싫은 성능에 당황 스럽습니다. 배경 만 그리면 그 밖의 것은 없습니다. 가장 기본적인 셰이더를 사용하는 40fps, 기본 파이프 라인을 사용하는 50fps입니다.OpenGL 성능 문제가있는 전체 화면 배경 텍스처 (iPad)

40fps는 그리 나쁘지는 않지만 그 위에 아무 것도 추가하면 fps가 떨어지며 그 위에 100-200 개의 다른 메쉬를 그릴 필요가 있다고 생각하면 15fps로 끝납니다. 그것은 단순히 쓸모가 없습니다.

내가 사용할 수있는 Xcode 프로젝트 here에 관련 코드를 격리, 그러나 그것의 본질은 정규 텍스처 맵의 예는 다음과 같습니다

static const GLfloat squareVertices[] = { 
    -1.0f, -1.0f, 
    1.0f, -1.0f, 
    -1.0f, 1.0f, 
    1.0f, 1.0f, 
}; 
static const GLfloat texCoords[] = { 
    0.125, 1.0, 
    0.875, 1.0, 
    0.125, 0.0, 
    0.875, 0.0 
}; 


glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

if ([context API] == kEAGLRenderingAPIOpenGLES2) { 
    // Use shader program. 
    glUseProgram(program); 

    glActiveTexture(GL_TEXTURE0); 
    glUniform1i(uniforms[UNIFORM_TEXTURE], 0); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    // Update attribute values. 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); 
    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, texCoords); 
    glEnableVertexAttribArray(ATTRIB_TEXCOORD); 
} else { 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

버텍스 쉐이더 :

attribute lowp vec4 position; 
attribute lowp vec2 tex; 

varying lowp vec2 texCoord; 

uniform float translate; 

void main() 
{ 
    gl_Position = position; 
    texCoord = tex; 
} 

조각 쉐이더 :

varying lowp vec2 texCoord; 
uniform sampler2D texture; 

void main() 
{ 
    gl_FragColor = texture2D(texture, texCoord); 
} 

두 개의 직사각형 크기 나누기 는 프레임 속도를 두 배로하므로 렌더링 시간은 도면이 화면에서 차지하는 부동산에 분명히 달려 있습니다. 이것은 완전히 의미가 있지만, 나에게 이해가되지 않는 것은 15fps 이상의 OpenGL 텍스처 매핑 된 메쉬로 전체 화면을 가리는 것이 불가능한 것입니다.

하지만 거기에는 수백 가지 게임이 있기 때문에 가능한 일이며 내가 틀린 일을해야합니다.하지만 그게 무엇입니까?

+0

FWIW, 관련 통화를 한 후에 클라이언트 상태를 활성화하는 이유는 무엇입니까? (예 : vert array를 활성화하기 전에 버텍스 포인터를 호출) –

+0

실제로 대부분의 코드는 OpenGL ES iPad 앱의 기본 템플릿에서 나온 것으로 좋은 코드는 아닙니다.하지만 작동하는 한 자신에게 묻지 않았습니다. 이런 식 으로든 다른 방식 으로든 이해할 수있게 만들었지 만 :-) –

답변

7

불행히도, 내가 가지고있는 것은 iPad 2를 지금 테스트하는 것입니다. (iPad 1 테스트 유닛이 집에 앉아 있습니다.) 엄청나게 빠른 조각 처리가 있습니다. 그것은 당신의 기록에서 1400 이론적 인 FPS와 더불어 60 FPS에 고정되어 있습니다.

그러나 OpenGL ES 드라이버 및 Time Profiler 도구를 사용하여 Instruments에서 실행했으며 멋진 새 OpenGL ES Analyzer (Xcode 4와 함께 제공됨)와 함께 실행했습니다. 다시 (

OpenGL ES Analyzer

는 OpenGL ES 드라이버에서 Tiler 이용 통계를 보면 거의 모두에서 사용되는 tiler을 보여 주지만, 렌더러 일부 사용을 갖는이는 OpenGL ES 분석기의 결과가 어떻게 생겼는지입니다 , 내 iPad 2에서만 5 %). 이것은 VBO와 인덱스를 사용하여 지오메트리에 대한 제안이 당신에게별로 도움이되지 않는다는 것을 나타냅니다. 당신은 10 %를 차지하고있는 프레임 버퍼를 바인딩 및 뷰포트 시간 프로파일에 따라 모든 프레임을 설정, 유지

OpenGL ES redundant calls

:

튀어 하나는 중복 통화에 대한 경고입니다 응용 프로그램에서 작업 부하. 당신의 프레임 도면의 시작 부분 라인

[(EAGLView *)self.view setFramebuffer]; 

을 언급하는 것은 (아마 measure using milliseconds for your rendering, 여담대로한다) 이론적 프레임 속도 1400 FPS에서 내 아이 패드 2에 27000 FPS로 이동하는 원인이되었다.

다시 말하지만 iPad 2의 강력한 GPU에 대한 테스트를 실행하고 있지만 원래 iPad 나 다른 기기에서 이와 비슷한 단계를 반복하여 성능 병목 현상을 확인하고 다른 사용자를 강조 할 수 있어야합니다.나는 새로운 OpenGL ES Analyzer가 쉐이더 관련 성능 문제를 해결하는데 매우 유용하다는 것을 발견했다.

+0

"불행히도, 지금 가지고있는 것은이 제품을 테스트 해보기위한 나의 iPad 2입니다." 나는 당신처럼 불행 해지고 싶습니다 :-) iPad 2의 보행을 통해 테스트 어플리케이션을 적용 해 주셔서 감사합니다! 나는 배경을 그리는 방식에 아무런 문제가 없다는 것을 당신의 대답에서 생각합니까? –

+0

@Guy - 방금 구식의 iPad 1에서이 도구를 사용해 보았습니다. 위의 중복 호출을 제거하기 전에도 구형 하드웨어에서 1400 이론적 인 FPS를 사용하여 60 FPS를 얻었습니다. 내 하드웨어에서 테스트 케이스가 그대로 빠르게 실행되기 때문에 Xcode 빌드 설정에 문제가있을 수 있습니다. 또한 해당 하드웨어에서 iOS 4.3.1을 사용하고 있습니다. 3.2 이상이면 느려질 수 있습니다. –

+0

감사를위한 묶음에 고마워, 나는 실제로 더 조사 할 것이다! –

0

와일드 추측 다음, 내가 어떤 아이 패드 경험이없는이 benchmark에 따라

을, 당신은 배경 해상도, 순수 채우기 속도 214fps에 대해 가질 것으로 예상 할 수있다.

텍스처가 제한적인지 확인하려면 텍스처링을 사용 중지하려고 했습니까?

질감이 '두 가지 질감이 아닌 것'입니까? 이 경우 GL_CLAMP(_TO_EDGE)으로 바꾸어 에서 GL_REPEAT을 제거하려고 시도 했습니까? NPOT를 반복하면 일부 하드웨어의 성능이 저하 될 수 있습니다.

궁극적으로 MIN/MAX 필터를 GL_NEAREST로 설정하려고 할 수도 있습니다.

+0

그림의 크기는 2 차원이 아니지만 512x512 텍스처로로드하고 GL_NEAREST도 시도했지만 GL_CLAMP는 시도하지 않았습니다. 윌, 포인터를 주셔서 감사합니다. –