2011-12-06 3 views
1

필자가 작성한 일부 CAD 소프트웨어가 있습니다. 그려지는 각 컴퍼넌트에는, 정점 버퍼 오브젝트 세트가 있습니다. JVML, 정점 버퍼 객체를 사용하여 JVM이 충돌하고 finalize 메소드에서 vbo를 해제하려고 시도합니다.

if (gl != null) { 
     Integer[] keys = vbos.keySet().toArray(new Integer[0]); 
     for (int i = 0; i < keys.length; i++) { 
      Integer tmp = keys[i]; 
      if (tmp != null) { 
       if (gl.glIsBufferARB(tmp.intValue())); 
       gl.glDeleteBuffersARB(1, new int[]{tmp.intValue()}, 0); 
      } 
     } 
    } 

그러나 나는 때때로 SIGSEV 및 JVM 충돌을 얻을 : 구성 요소가 삭제됩니다 경우에, 나는 같은 finalize 메소드의 정점 버퍼 객체를 해제해야합니다. hs_err 로그 파일은 gl.glIsBufferArb (tmp.intValue())를 가리 킵니다.

내 gl 개체가 더 이상 유효하지 않습니다.

나는 여전히 유효하다고 생각합니다. 충돌 전까지는 프로그램이 계속 작동했습니다. GL 객체에 대한 참조를 저장하지 않고 glbuffer를 해제 할 수 있습니까?

감사합니다.

답변

4

여기서 가장 분명한 문제는 OpenGL 컨텍스트가 활성화 된 스레드에서만 참조 될 수 있다는 것입니다. 일반적으로 이것은 렌더링 스레드가됩니다. 즉, OpenGL 컨텍스트는 JVM의 파이널 라이저 스레드에서 사용할 수 있습니다. 저에게, 당신의 실수의 가장 큰 원인 인 것처럼 보입니다. 무효화 된 VBO의 전역 목록을 유지하고 finalize 메소드에 해당 목록에 ID를 추가하는 것이 좋습니다. 그런 다음 렌더링 스레드에서 해당 목록을 주기적으로 처리하여 OpenGL 호출을 통해 VBO를 실제로 삭제할 수 있습니다.

멀티 스레드 환경에서 OpenGL의 동작에 대한 간략한 설명은 here입니다.

+0

이것은 좋은 제안입니다. 감사합니다! – vextorspace