2012-06-27 10 views
3

카메라에서 비디오를 가져 와서 CoreImage 및 OpenGL을 사용하여 렌더링하려고합니다. 내가 실행 중일 때 예상대로 화면에 그림이 표시되고 EXEC_BAD_ACCESS가 표시됩니다. ARC를 사용하고 있습니다. iOS6 Beta1. 제발 도와주세요.cicontext drawImage : inRect : fromRect가 ios6에서 충돌 함

업데이트 : 5.1에서 작동하지만 6.0에서는 작동이 중단됩니다. 모든 예외 중단 점을 발생 시켰지만 EXEC_BAD_ACESS가 presentRendBuffer> gpus_ReturnGuiltyForHardwareRestart에서 발생합니다.

업데이트 2 : 카메라 관련 코드를 제거했지만 여전히 충돌이 발생합니다.

업데이트 3 : glClearColor & glClear 명령을 내 주석으로 처리하면 내 앱이 중지되는 문제를 해결했습니다. 하지만 Core Image와 함께 OpenGL을 동시에 사용하는 방법을 알고 싶습니다.

내 새로운 코드로 간단하게 :이 코드는 아이폰 & 아이 패드 6.0 시뮬레이터에서 작동

@interface MGViewController() { 
... 
} 
@property (strong, nonatomic) EAGLContext *glcontext; 
@property (strong, nonatomic) CIContext *cicontext; 
@property (strong, nonatomic) CIImage *ciimage; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.glcontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 

    if (!self.glcontext) { 
     NSLog(@"Failed to create ES context"); 
    } else { 
     self.cicontext = [CIContext contextWithEAGLContext:self.glcontext]; 

     if (!self.cicontext){ 
      NSLog(@"Failed to create CI context"); 
     } 
    } 

    GLKView *view = (GLKView *)self.view; 
    view.context = self.glcontext; 
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24; 

    self.ciimage = [[CIImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"roomphoto" withExtension:@"png"]]; 
} 

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 

     glClearColor(0.0, 0.5, 0.0, 1.0); 
     glClear(GL_COLOR_BUFFER_BIT); 

     [self.cicontext drawImage:self.ciimage 
          inRect:self.ciimage.extent 
         fromRect:self.ciimage.extent]; 
} 

; iPad2 iOS 6.0 Beta2에서 EXEC_BAD_ACCESS로 충돌합니다.

Invalid shader program, probably due to exceeding hardware resourcesCould not load the kernel!Could not load the kernel! ... 

것은 무엇 잘못 될 수 있습니다 그리고 그것은 나를 콘솔의 메시지와 아이 패드 1 & 아이폰 4S 아이폰 OS 5.1.1에 단지 녹색 화면 준다?

+2

iOS5.x에서 충돌이 발생합니까? –

+0

아니요, 5.1.1에서는 내 iPhone에서 작동하지만 6.0에서는 iPad에서 작동하지 않습니다. 지난 번 콘솔에서 메시지를 받았습니다. 백그라운드에서 처리 중이기 때문에 GPU를 사용하여 렌더링 할 수 없습니다. 화면으로 렌더링 할 때 CPU로 되돌릴 수 없습니다. 렌더링이 실패 할 수 있습니다! (lldb) drawImage : inRect : fromRect가 iOS6에서는 비동기이지만 iOS5에서는 동기화가 원인 일 수 있습니까? – Seify

+0

명령 + 6을 누르십시오. 왼쪽 하단의 작은 플러스 버튼을 클릭하십시오. "Add Exception Breakpoint"를 선택하십시오. 완료를 클릭하십시오. 응용 프로그램을 다시 실행하십시오. 예외의 정확한 위치를 볼 수 있습니다. 더 나은 피드백을 얻으려면 여기에보고하십시오. –

답변

2

마지막으로 앱이 중단되는 것을 막을 수있었습니다. gl 명령과 [cicontext drawImage ...] 명령 사이에 glFlush()을 추가했습니다.

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 
{ 

     glClearColor(0.0, 0.5, 0.0, 1.0); 
     glClear(GL_COLOR_BUFFER_BIT); 

     glFlush(); 

     [self.cicontext drawImage:self.ciimage 
          inRect:self.ciimage.extent 
         fromRect:self.ciimage.extent]; 
} 

결과가 완벽하지 않습니다. 일부 지터 등을 볼 수 있지만 적어도 작동합니다. 이유는 자세히 설명해 주시면 감사하겠습니다.

+0

iOS 5.x에서 실행했지만 iOS 6.0 베타 버전에서 충돌이 발생하면이 버전이 베타 버그임을 분명히합니다. https://bugreport.apple.com/에서 버그 보고서를 제출하는 것이 좋습니다. 이상적으로는 이것을 재현하는 테스트 프로젝트를 사용하는 것이 좋습니다. 이는 Core Image 팀이 적절한 출시 전에이 문제를 해결하는 데 도움이됩니다. –

+0

조언 해 주셔서 감사합니다. – Seify

+0

Yeap. 그것은 버그였습니다. – Seify

1

drawImage : inRect : fromRect is iOS 6에서 비동기입니다.