2012-10-03 3 views
1

내 앱이 거의 끝났습니다. 보기 중 하나는 GLKit을 사용합니다. 나는 기억에 문제가있다. 기본적으로 GLKView가 표시되면 메모리 소비가 계속 증가합니다 (Instruments에서 확인). 특정 시점에서 분명히 충돌합니다. GLKit에 대해 잘 모릅니다. 그래서 저를 도울 수 있기를 바랍니다.시간이 지남에 따라 메모리 사용량이 계속 증가합니다 (GLKit - iOS)

문제는 내가 표시하고있는 3D 화살표입니다. 내가 그릴 수 없다면, 다른 모든 것들은 어떤 문제도 일으키지 않습니다. 이 화살표 정점 데이터가 들어있는 헤더 파일입니다

#import <GLKit/GLKit.h> 

struct arrowVertexData 
{ 
    GLKVector3  vertex; 
    GLKVector3  normal; 
    GLKVector2  texCoord; 
}; 
typedef struct arrowVertexData arrowVertexData; 
typedef arrowVertexData* vertexDataPtr; 


static const arrowVertexData MeshVertexData[] = { 
    {/*v:*/{{-0.000004, 0.0294140, -0.0562387}}, /*n:*/{{0.000000, 1.000000, 0.000000}}, /*t:*/{{0.500000, 0.333333}}}, 
... etc... 

는 그리고 이것은 그리기 코드 :

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    [self.arrowEffect prepareToDraw]; 
    //glGenVertexArraysOES(1, &arrowVertexArray); 
    //glBindVertexArrayOES(arrowVertexArray); 

    glGenBuffers(1, &arrowVertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, arrowVertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(MeshVertexData), MeshVertexData, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(arrowVertexData), 0); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_TRUE, sizeof(arrowVertexData), (void *)offsetof(arrowVertexData, normal)); 
    glBindVertexArrayOES(arrowVertexArray); 

    // Render the object with GLKit 

    glDrawArrays(GL_TRIANGLES, 0, sizeof(MeshVertexData)/sizeof(arrowVertexData)); 

    //reset buffers 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

    //disable atttributes 
    glDisableVertexAttribArray(GLKVertexAttribNormal); 
    glDisableVertexAttribArray(GLKVertexAttribPosition); 
} 

어떤 제안? 도움 주셔서 대단히 감사합니다!

+1

감사합니다. 지금 해 보았습니다. – Davide

답변

2

drawInRect가 호출 될 때마다 새 버텍스 버퍼 (VBO)를 만들고 절대 삭제하지 않습니다. GLGenBuffers와 GLBindBuffer가 설정되고 새로운 버퍼가 만들어지면 현재의 상태로 만들지 만 실제 피해는 GLBufferData로 처리됩니다. 은 데이터를 새 버퍼에으로 복사합니다.

glBindBuffer (GL_ARRAY_BUFFER, 0); 버퍼를 사용하지 않도록 GL을 재설정하고 glDisableVertexAttribArray (GLKVertexAttribPosition); GL이 더 이상 버퍼의 위치 데이터를 찾지 않도록 지시하지만,이 호출 중 어느 것도 메모리를 비우는 데 아무 것도하지 않습니다. 매번 메모리를 확보하려면 GLDeleteBuffers (1, & arrowVertexBuffer)를 호출해야합니다. 메모리를 비울 수 있습니다.

더 나은 방법은 시작시 버퍼를 생성하고 종료 할 때 버퍼를 삭제하고 arrowVertexBuffer에 연결하여 필요에 따라 포인터를 다시 설정하여 매번 다시 바인딩하고 바인딩을 해제하는 것입니다. 프로그램이 GL 상태를 수정 중입니다.

VAO (Vertex Array Object)를 사용하여 경로를 시작한 것처럼 보입니다. VBO가 올바르게 작동 할 때까지 기다리는 것이 더 나을지 모르지만 다시 한 번 상태를 캡처하는 또 다른 방법 일 것입니다. 그것을 시도. VBO와 VAO는 모두 렌더링 루프를 통해 매번로드를 줄이기 위해 시간이 지남에 따라 진화 한 캐싱 상태를위한 메서드이지만 VAO는 훨씬 더 많은 그물을 캐스팅합니다.

일반적인 제안으로 [Open GL]과 같이 더 일반적이며 인기있는 태그를 추가하여 이와 같은 질문에 더 많은 관심을 갖게 될 수도 있습니다.

분명히 시도해야하는 또 다른 디버깅 도구는 OpenGL Profiler입니다. Xcode와 함께 설치하지 않았다면 설명서에서 찾아보고 그래픽 도구 패키지를 다운로드 할 수있는 링크를 찾아야합니다.리소스 창에서 사용중인 버퍼 객체를 추적 할 수 있습니다.

0

Xcode에서 정적 분석기를 실행 해 보았습니까?

해제 된 메모리와 할당 된 메모리를 지적하는 것이 좋습니다.

"실행"버튼을 누른 상태에서 드롭 다운 목록에서 "분석"을 선택하십시오.

그것은 일반적으로 파란색을 지적하고 등등 ...

그 어떤 영향이 있는지 알려주세요, 다시 메모리가 할당되는 위치에하지 추적을 발표 라인을 볼 수 있습니다 아무것도 찾을 않는 경우 .

+0

감사하지만 유감스럽게도 정적 분석기는 아무런 문제가 없습니다. – Davide

관련 문제