2010-02-16 4 views
0

내 iPhone 응용 프로그램에서 텍스처를로드하는 데 좋은 짧은 메소드가 있습니다. 여기서 나는 glGenTextures(13, &textures[0]);입니다. 물론 내가 glDeleteTextures(13, textures);을하지만, 메모리가 완전히 내가이 줄을 주석 전까지 해제되지 않습니다의 끝에 : CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);' (이 완전히 검은 색 질감을 ​​가진 코스 결과) 다음 줄은 말한다 있지만 :CGContextRelease(); 컨텍스트를 해제하지 않습니까?

CGContextRelease(textureContext); 

이 텍스처를로드하기위한 전체 코드는 다음과 같습니다

- (void)loadTexture:(NSString *)name intoLocation:(GLuint)location { 
    CGImageRef textureImage = [UIImage imageNamed:name].CGImage; 
    if (textureImage == nil) { 
     NSLog(@"Failed to load texture image"); 
     return; 
    } 

    NSInteger texWidth = CGImageGetWidth(textureImage); 
    NSInteger texHeight = CGImageGetHeight(textureImage); 

    GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight << 2); 

    int k, l = texWidth * texHeight << 2; 
    for (k=0; k<l; k++) textureData[k] = 0; 

    CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth << 2, CGImageGetColorSpace(textureImage), 
                 kCGImageAlphaPremultipliedLast); 
    CGContextTranslateCTM(textureContext, 0, texHeight); 
    CGContextScaleCTM(textureContext, 1.0, -1.0); 
    CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage); 
    CGContextRelease(textureContext); 

    glBindTexture(GL_TEXTURE_2D, location); 
    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, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

    free(textureData); 
    glEnable(GL_TEXTURE_2D); 
} 
+0

코드가 정상적으로 보입니다. 어떻게 누수가 일어나고 있다고 판단하는거야? –

+0

이 방법에는 누수가 없습니다. 이런 텍스쳐를로드 할 때, 나는 그 텍스쳐를로드하는 데 사용했던 메모리를 릴리즈 할 수 없다. – Tom

답변

0

의 CGImage이 데이터를 자사의 그린 느리게 처음으로 디코딩한다. 그것은 디코딩 된 데이터를 유지합니다.

UIImage 클래스는 이름으로 UIImage 인스턴스를 캐시하고 인스턴스는 디코딩 된 데이터를 보유하고있는 CGImages를 보유합니다. UIImage 캐시는 메모리 부족 경고에 대한 응답으로 제거됩니다.

이것이 앱에서 너무 많은 메모리를 사용하는 경우 UIImages의 생성 및 삭제를보다 신중하게 제어해야합니다. 즉, [UIImage imageNamed :]를 사용하지 않는 것입니다.

반면에 일반적으로 응용 프로그램에는 많은 이름이 지정된 이미지가 없습니다. 이는 컴파일 타임에 결정된 정적 세트입니다. 이 메모리 사용량에 대해 이 궁금하다면을 사용해 보시기 바랍니다.

+0

답장을 보내 주셔서 감사합니다. 내 게임 (1MB)에서는 많은 텍스처를 사용하지 않으므로 괜찮습니다.하지만이 메모리를 공개 할 수 없기 때문에 텍스처를로드하는 방법이 튜토리얼에서 일반적으로 나타나는 이유가 궁금합니다. 누구든지 텍스처를로드하는 더 좋은 방법을 추천 해 주시겠습니까? – Tom

+0

'+ [UIImage imageNamed :]'는 이미지를 계속 사용하는 코코아 앱에 매우 적합합니다. 단 한 번만 텍스처에 덤프하는 이미지는 그렇지 않습니다. GL에 익숙하지 않아서 가장 쉬운 점이 무엇인지 잘 모릅니다. '- [NSBundle pathForResource : ofType :]'를 사용하여 이미지 경로를 얻을 수 있습니다. 오히려 이미지 데이터 (디스크 상 포맷)를 원한다면, - [NSData initWithContentsOfFile :]'를 사용할 수 있습니다. UIImage가 편리하고 캐시를 좋아하지 않는다면, - [UIImage initWithContentsOfFile :]'. – Ken

관련 문제