512x512 텍스처 타일에도 불구하고 iPhone에 큰 GPU 스트레스를 유발합니다.

StackOverflow https://stackoverflow.com/questions/872560

문제

iPhone에서 간단한 OpenGl ES 구현 (2D 게임)을 테스트하고 있습니다. 높은 렌더링 활용이 있음을 알 수 있습니다 프로파일 러를 사용하는 동안. 이것이 사실입니다.

  • 표시 중입니다 하나의 사전로드 된 큰 질감 (512x512 픽셀) 60fps에서 렌더 이용은 약 40%입니다.
  • 내 질감은 사용하여 혼합됩니다 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 내가 사용하는 유일한 GL 기능.
  • 나는 질감을 만들려고 노력했다 더 작고 타일 그것, 뭐야 차이가 없었습니다.
  • 1024x1024 픽셀의 PNG 텍스처 아틀라스를 사용하고 있습니다

나는 이것이 매우 이상하다고 생각한다 하나의 텍스처는 이러한 강렬한 GPU 사용을 유발합니다.

이것이 기대 될까요? 내가 뭘 잘못하고 있죠?

편집하다: 내 코드 :

// OpenGL setup is identical to OpenGL ES template
// initState is called to setup
// timer is initialized, drawView is called by the timer

- (void) initState
{
    //usual init declarations have been omitted here        
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);     
    glEnableClientState (GL_VERTEX_ARRAY);
    glVertexPointer     (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].x);          
    glEnableClientState (GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer   (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].tx);     
    glEnableClientState (GL_COLOR_ARRAY);
    glColorPointer      (4,GL_UNSIGNED_BYTE,sizeof(Vertex),&allVertices[0].r);    
}    
- (void) drawView
{       
    [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();

    GLfloat width  = backingWidth /2.f; 
    GLfloat height = backingHeight/2.f; 

    glOrthof(-width, width, -height, height, -1.f, 1.f);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0.f, 0.f, 0.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT);       
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);       
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];      
    [self checkGLError];        
}

편집하다: 나는 몇 가지 개선을했지만 렌더 활용을 낮추지 못했습니다. 32x32의 일부에서 텍스처를 나누고 좌표 유형과 텍스처 좌표를 Glfloat에서 Glshort로 변경하고 퇴행성 삼각형을위한 추가 정점을 추가했습니다.

업데이트는 다음과 같습니다.

초기 상태 :(정점 및 텍스처 포인터는 이제 GL_SHORT입니다)

glMatrixMode(GL_TEXTURE);
glScalef(1.f / 1024.f, 1.f / 1024.f, 1.f / 1024.f);
glMatrixMode(GL_MODELVIEW);
glScalef(1.f / 16.f, 1.f/ 16.f, 1.f/ 16.f);

DrawView :

glDrawArrays(GL_TRIANGLE_STRIP, 0, 1536); //(16*16 parts * 6 vertices)  
도움이 되었습니까?

해결책

이 게시물을 읽으십시오.

512x512는 아마도 iPhone이 다루는 데 약간 낙관적 일 것입니다.

편집하다:

나는 당신이 이미 이것을 읽었다고 생각하지만 그렇지 않다면 iPhone에서 최적의 Opengl ES 성능에 대한 사과 안내서를 확인하십시오.

다른 팁

GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA를 사용하여 2D 환경에서 서로 5 개의 512x512 텍스처를 표시하는 앱을 작성하고 있으며 약 14fps를 얻을 수 있습니다. 정말 60fps가 필요합니까? 게임에서는 24-30이 괜찮을 것이라고 생각합니다. 또한 가능한 경우 PVR 텍스처 압축을 사용하십시오. SDK에 포함 된 예가 있습니다.

  1. 나는 당신이 비활성화하는 것을 잊지 않았기를 바랍니다 GL_BLEND 이미 필요하지 않은 경우.
  2. 메모리 대역폭 최적화를 시도 할 수 있습니다 - 16 BPP 형식 또는 PVRTC를 사용하십시오. 텍스처 크기의 텍스처 캐시가있는 IMHO는 전혀 도움이되지 않습니다.
  3. 프레임 버퍼가 iPhone UI에 의해 텍스처로 사용되고 있음을 잊지 마십시오. 32 비트 RGBA로 생성되면 한 번 더 알파 블렌딩됩니다. 최적의 성능의 경우 16 비트 565 프레임 버퍼가 최고입니다 (그러나 그래픽 품질이 어려워집니다).

캐시 크기와 같은 모든 세부 사항을 알지 못하지만 비디오 메모리에 업로드 할 때 텍스처 픽셀이 이미 스위핑되었으며 삼각형이 PVR 타일 엔진으로 분리됩니다. 따라서 자신의 분할은 중복되는 것처럼 보입니다.

그리고 마지막으로. 이것은 모바일 저전력 GPU 일 뿐이며 거대한 화면과 높은 충전물 용으로 설계되지 않았습니다. 알파 블렌딩은 비용이 많이 들며 파워 칩에서 3-4 배의 차이가있을 수 있습니다.

정확히 문제는 무엇입니까?
당신은 당신의 60fps를 얻고 있습니다. 그것은 매끄럽습니다.

렌더 이용률이 40%인지 누가 신경 쓰나요?

문제는 iPhone의 텍스처 캐시 크기 때문일 수 있습니다. 상태를 설정하는 방법에 따라 각 개별 삼각형, 쿼드 또는 Tristrip에 질감이 얼마나 많은지에 따라 올 수 있습니다.

이것을 시도하십시오 : 쿼드를 세분화하고 테스트를 반복하십시오. 따라서 1 쿼드라면 4. 그런 다음 16 등을 만들고 도움이되는지 확인하십시오. 열쇠는 각 원시 참조가있는 실제 픽셀 수를 줄이는 것입니다.

텍스처 캐시가 날아 가면 하드웨어는 메인 메모리에서 텍스처 조회를 메인 메모리에서 텍스처 버퍼를 위해 따로 보관하는 모든 텍스처 조회를 스래쉬합니다. 각 픽셀. 이것은 성능을 빠르게 죽일 수 있습니다.

또는 - 나는 iPhone 하드웨어를 정말로 모르기 때문에 완전히 잘못되었으며 PVR 칩은 내가 익숙한 것과 비교할 때 이상한 짐승이라는 것을 알고 있습니다 (PS2, PSP). 아직도 시도하기 쉬운 테스트이며 도움이되면 궁금합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top