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 텍스처 매핑 된 메쉬로 전체 화면을 가리는 것이 불가능한 것입니다.
하지만 거기에는 수백 가지 게임이 있기 때문에 가능한 일이며 내가 틀린 일을해야합니다.하지만 그게 무엇입니까?
FWIW, 관련 통화를 한 후에 클라이언트 상태를 활성화하는 이유는 무엇입니까? (예 : vert array를 활성화하기 전에 버텍스 포인터를 호출) –
실제로 대부분의 코드는 OpenGL ES iPad 앱의 기본 템플릿에서 나온 것으로 좋은 코드는 아닙니다.하지만 작동하는 한 자신에게 묻지 않았습니다. 이런 식 으로든 다른 방식 으로든 이해할 수있게 만들었지 만 :-) –