2012-04-20 1 views
6

현재 OpenGL ES 1.0을 사용하여 기본 텍스처를 렌더링하는 iOS 응용 프로그램 (iPad 및 iPhone)을 개발 중입니다. 나는 텍스처를 저장하고 표현하기 위해 아틀라스를 사용합니다.OpenGL ES가 메모리에서 내 텍스처를 삭제하지 않습니다.

내 아틀라스는 비교적 크기가 크지 만 (2000x2000) 내 내부 알고리즘은 2048x2048 크기로 텍스처를로드하고 크기를 조정합니다. OpenGL ES는 2 크기의 텍스처 만 허용하기 때문입니다. 타일을 그릴 수있어 모든면이 이쪽에 좋다.

텍스처를로드 및 언로드 (파괴) 할 때마다 심각한 메모리 누수가 발생합니다. 이것은 최종 버전에서 발생해야하지만 내 로딩과 언 로딩이 잘되었는지 확인해야했습니다. 메모리에서 텍스처는 2048x2048x4 (RGBA) 바이트 = 약 16MB를 차지합니다. 이것은 방대한 양의 바이트이므로 문제는 나에게 상당히 성가신다고 이해합니다. (iOS가 몇 분 후에 응용 프로그램을 종료합니다 ..)

텍스처를로드하면 Instrument는 응용 프로그램이 16MB 씩 증가합니다. 올바른 것입니다 ("실제 메모리"열을 사용합니다). 문제는 내가 사용 가능한 모든 바이트를 제거하기 위해 텍스처를 파괴해야 할 때 발생합니다. 16MB를 결코 잃지 않습니다 ... 그리고 루프에서로드 및 언로드하기 때문에 메모리는 계속 사용되고 사용되지 않습니다. 오류가 있는지 확인하는 사방)

glDeleteTextures(1, &_texture); 

내가 glGetError의을 (사용 (I 체크,이라고 함) 나는 질감을 언로드하는 방법

다음
GLubyte *outData = malloc((_dataWidth * _dataHeight * 4) * sizeof(*outData)); 
GLuint _texture; // declared as un instance variable so its address never changes 
glGenTextures(1, &_texture); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _dataWidth, _dataHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, outData); 
free(outData); 

는 것 : 여기

내가 텍스처를로드하는 방법 발생하지만 항상 0을 반환합니다 (glDeleteTexture 후에도).

누구나 아이디어가 있습니까? 감사합니다.

+0

부수적으로 iPhone 3G S 및 그 이후의 모든 iOS 장치는 OpenGL ES 1.1 : http://stackoverflow.com/a/4761453/19679에서 2가 아닌 텍스처를 지원해야합니다. 또한, PVRTC (PowerVR Texture Compression)를 사용하기 위해 아틀라스를 변환하는 것에 대해 생각해 보셨습니까? 이러한 방식으로 압축 된 텍스처는 실제로 압축 형식으로 메모리에 저장되므로 압축되지 않은 텍스처보다 훨씬 작아집니다. 누출은 해결되지 않지만 일반적으로 좋은 아이디어 일 수 있습니다. –

답변

14

컨텍스트를 만든 동일한 스레드에서 텍스처를 제거해야합니다. 컨텍스트없이 GL 호출을 수행하는 경우 오류가 발생하지 않습니다.

+0

감사합니다! 그것은 효과가 있었다. –

+1

Max,이 대답은 코어 이미지에서 텍스처가 누설되는 것을 추적하는 데 도움이되었습니다. (CIContext가 스레드 경계를 통해 공유되기 때문에.)이 짧은하지만 매우 유용한 게시물에 대해 감사드립니다. – chockenberry

1

GL_APPLE_client_storage 확장 기능을 사용해 보셨습니까? 즉, 텍스처 메모리 복사본이있는 OpenGL 대신 glDeleteTextures이 호출 될 때까지 glTexImage2D에 전달 된 데이터 블록을 유지할 것을 약속합니다.

+0

iOS에서 사용하도록 설정되어 있습니까? 나는 이것이 iOS 용으로 문서화되지 않았다는 느낌을 가지고있다. –

+0

그래, 그 연장은 맥용이라고 생각해. iOS 5.0에서 우리는 텍스처 캐시에서 비슷한 것을 사용할 수 있습니다.하지만 여기서는 그렇지 않습니다. –

관련 문제