큰 (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 메서드 사용에 대한 제안 사항이 있으십니까?
좋은 아이디어. Apple의 프레임 워크를 사용하는 것이 항상 최선의 방법입니다. 그들은 다른 누구도 할 수없는 일을 할 수 있습니다 (jpeg 압축 해제 하드웨어 사용). –
'GLKTextureLoader'에는'textureWithCGImage'도 있습니다. – 246tNt
GLKTextureLoader를 시도했지만 (위의 편집 참조) 내 파일에서는 작동하지 않습니다. 나는'textureWithCGImage'를 시도 할 것입니다. – bphi