2016-06-03 2 views
1

큰 (5 메가 픽셀) jpeg 이미지를로드하고 그 이미지에서 openGL 텍스처를 만들어야합니다. 그것들은 2의 비표준 적이기 때문에이 어플리케이션을 위해 사전 처리 될 수 없습니다. Loading은 매우 느립니다. iPad Air 2에서 이미지 당 약 1 초. 이러한 이미지를 12 개 또는 2 개로드하고 가능한 한 빨리 각각의 GL 텍스처를 만들어야합니다.JPEG-2000에서 OpenGL 텍스처를 만드는 빠른 방법?

프로파일 링은 병목 현상이 CGContextDrawImage로 표시됩니다. 이전 답변은 이것이 일반적인 문제라고 제안합니다.

This previous answer이 가장 관련성이 높고 (불행히도) 나에게 희망을주지 않습니다. 아직 lib-jpeg (다른 답변에서 제안)를 시도하지 않았습니다. 몇 가지 이유로 제 3 자 코드를 유지하려고합니다.

하지만 그 대답은 2014 년이었고 모든 것이 바뀝니다. 누구든지 jpeg에서 텍스처를 만드는 더 빠른 방법을 알고 있습니까? CGContextDrawImage 인수를 변경하여 (예 : this answer - 눈에 띄는 속도 변경없이 제안 된 변경 사항을 시도했습니다) 완전히 다른 접근 방식을 사용하고 있습니까? (비동기 적으로 호출)

현재의 텍스처 생성 블록 :

UIImage *image = [UIImage imageWithData:jpegImageData]; 
if (image) { 

    GLuint textureID; 
    glGenTextures(1, &textureID); 
    glBindTexture(GL_TEXTURE_2D, textureID); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    GLsizei width = (GLsizei)CGImageGetWidth(image.CGImage); 
    GLsizei height = (GLsizei)CGImageGetHeight(image.CGImage); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    void *imageData = malloc(height * width * 4); 
    CGContextRef imgcontext = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 
    CGContextDrawImage(imgcontext, CGRectMake(0, 0, width, height), image.CGImage); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 
    CGContextRelease(imgcontext); 
    free(imageData); 

    // ... store the textureID for use by the caller 
    // ... 
} 

내가 GLKTextureLoader 시도 (추가 편집). "GLKTextureLoaderErrorDomain"- 코드 : 12.

내가로드해야하는 JPEG는 JPEG 2000이라는 사실을 깨달았습니다. 그게 문제 일 수 있습니다. 나는 GLKTextureLoader 접근 방식으로 놀았습니다. J2K 이외의 jpeg는 작동시킬 수 있지만로드해야하는 J2K는 작동하지 않습니다. 언급 한 바와 같이 jpegImageData는 상기 오류가 전무로 돌아 오면,

NSData *jpegImageData = [data subdataWithRange:NSMakeRange(offset, dataLength)]; 
GLKTextureInfo *jpegTexture; 
NSError *theError; 
jpegTexture = [GLKTextureLoader textureWithContentsOfData:jpegImageData options:nil error:&theError]; 

하지만 (FWIW, 내가 큰 파일 내부 포장로드하는 데 필요한 파일, 따라서 나는 같은 파일 내에서 데이터 부분 범위를 추출 .이 심지어 subdataWithRange 접근 방식을 사용하여 작은 사진과 작동합니다. 마찬가지로

,

UIImage *image = [UIImage imageWithData:jpegImageData]; 
jpegTexture = [GLKTextureLoader textureWithCGImage:image.CGImage options:nil error:&theError]; 

반환 같은 "코드 12"오류 무기 호.

iOS Developer page (Table 1-1)은 JPEG-2000은 OS X에서 지원됩니다 것을 제안,하지만 지원되는 형식을 표시하기위한

CFArrayRef mySourceTypes = CGImageSourceCopyTypeIdentifiers(); CFShow(mySourceTypes);

접근을 시도 할 때, JPEG-2000 (내 iOS 장비에서 실행) 그들 중 하나입니다 :

33 : <CFString 0x19d721bf8 [0x1a1da0150]>{contents = "public.jpeg- 

JPEG-2000에서 더 빠른 GLKTextureLoader 메서드 사용에 대한 제안 사항이 있으십니까?

답변

1

GLKit Framework method을 사용해 보셨습니까?

GLKTexGtureInfo *spriteTexture;  
NSError *theError; 

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Sprite" ofType:@"jpg"]; // 1 

spriteTexture = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:&theError]; // 2 

glBindTexture(spriteTexture.target, spriteTexture.name); // 3 
+0

좋은 아이디어. Apple의 프레임 워크를 사용하는 것이 항상 최선의 방법입니다. 그들은 다른 누구도 할 수없는 일을 할 수 있습니다 (jpeg 압축 해제 하드웨어 사용). –

+0

'GLKTextureLoader'에는'textureWithCGImage'도 있습니다. – 246tNt

+0

GLKTextureLoader를 시도했지만 (위의 편집 참조) 내 파일에서는 작동하지 않습니다. 나는'textureWithCGImage'를 시도 할 것입니다. – bphi

관련 문제