ios - tutorial - gpus_ReturnGuiltyForHardwareRestart[EAGLContext presentRenderbuffer]의 충돌



swift opengl (1)

내 경험에 비추어 볼 때 이런 종류의 충돌이 발생합니다.

  1. 응용 프로그램이 UIApplicationStateBackground 상태 일 때 OpenGL API를 호출합니다.
  2. 다른 shareGroup을 가진 OpenGL 컨텍스트에서 생성 된 객체 (텍스처, VBO 등) 사용. 이것은 렌더링이나 다른 OpenGL 객체로 작업하기 전에 [EAGLContext setCurrentContext : ..]를 호출하지 않으면 일어날 수 있습니다.
  3. 형상이 잘못되었습니다. 예를 들어, 필요한 더 큰 크기의 인덱스 버퍼를 할당하면 이런 일이 발생할 수 있습니다. 일부 값으로 채운 다음 할당시 사용한 크기로 렌더링 해보십시오. 때때로 이것은 작동합니다 (버퍼 꼬리는 0으로 채워지며 시각적 결함은 보이지 않습니다). 때로는 충돌이 발생합니다 (버퍼의 꼬리가 쓰레기로 채워지고 범위를 벗어나는 지점 참조).

희망이 어떤 식 으로든 도움이됩니다.

추신 : 귀하의 응용 프로그램에 대한 자세한 정보를 알려주십시오. 현재 iOS에서 벡터지도를 렌더링하는 애플리케이션을 작성하고 있으며 현재 iOS 11에 문제가 발생하지 않았습니다. 렌더링 파이프 라인은 매우 간단합니다. 다음 프레임을 렌더링 할 수있을 때 주 스레드에서 콜백을 호출합니다. OpenGL 씬을 가진 각 뷰는 백그라운드에서 리소스를로드 할 수있는 몇 가지 백그라운드 컨텍스트를 가질 수 있습니다 (ofc는 주 컨텍스트와 동일한 shareGroup을 가짐).

iOS 11의 EAGLContext presentRenderbuffer 에서 충돌이 많이 발생하지만 iPhone 6 / 6 이상에서만 발생합니다.

이 게시물에 따르면 VBO / VAO를 사용하지 않기 위해 모든 것을 다시 작성하여 VBO 관련 문제를 이미 배제했다고 생각하지만 충돌은 해결되지 않았습니다.

그래서 이것에 대한 몇 가지 다른 질문이 있습니다. 해결책은 없습니다. 다른 누구도이 충돌 사고를보고 해결할 수 없었습니까?

TL; DR :

지금까지 우리가 알고있는 것이 있습니다 :

  • 이 충돌은 iOS11, iPhone 5S / 6 / 6 +에서만 발생합니다. 6S 이상에서는 발생하지 않습니다.
  • OpenGL 스택의 핵심은 gpus_ReturnGuiltyForHardwareRestart를 반환합니다.
  • CAEAGLLayer에서 [EAGLContext presentRenderbuffer]를 호출하려고 할 때 발생합니다.
  • 우리는 재현이 없다.

우리가 지금까지 시도한 것 :

  • 렌더링 스택에서 VBO / VAO에 대한 참조를 제거하십시오. 도와주지 않았어.
  • 우리는 다양한 범위의 드로잉 시나리오 (회전, 크기 조절, 배경 / 전경)로 다시 인쇄 해 보았습니다. 불운.
  • 우리가 말할 수있는 한, iPhone 6 제품군과 iPhone 6S 제품군 간의 애플리케이션 로직에는 특별한 것이 없습니다.

몇 가지 단서 (관련성이 있지만 반드시 그런 것은 아닙니다) :

  • presentRenderBuffer가 주 스레드에서 호출되고 일부 스레드가 주 스레드에서 동시에 발생하면 충돌 속도가 빨라진다는 것을 알고 있습니다.
  • presentRenderBuffer가 (전체 드로잉 파이프 라인과 함께) 주 스레드에서 호출 될 때 충돌 속도는 약간 떨어지지 만 크게는 아닙니다.
  • 레이어가 스크린에서 벗어나거나 뷰 계층 구조에서 벗어나면 충돌이 상당 부분 (~ 20 %) 발생합니다.

다음은 스택 추적입니다.

  libGPUSupportMercury.dylib gpus_ReturnGuiltyForHardwareRestart

1 AGXGLDriver gldUpdateDispatch
2 libGPUSupportMercury.dylib gpusSubmitDataBuffers
3 AGXGLDriver gldUpdateDispatch
4 GLEngine gliPresentViewES_Exec
5 OpenGLES -[EAGLContext presentRenderbuffer:]




opengl-es