2012-02-18 1 views
2

OpenBGL을 사용하여 웹캠 피드를 표시하는 FireBreath를 사용하여 Windows 용 플러그인을 개발 중입니다. 저는 윈도우 플러그인을 사용하고 있으며 별도의 스레드에서 그리기하고 있습니다. 코드는 여기에서 볼 수 있습니다 :보이는 영역이 변경되면 OpenGL 플러그인이 작동을 멈 춥니 다.

헤더 파일

https://github.com/EvilTengil/kinect-at-home-plugin/blob/0007beecf136ff2e5e1aa50be94d4906447a8f43/Win/KinectAtHomeWin.h

소스 파일

https://github.com/EvilTengil/kinect-at-home-plugin/blob/0007beecf136ff2e5e1aa50be94d4906447a8f43/Win/KinectAtHomeWin.cpp

(가 커밋에 남아 그냥 테스트입니다, onWindowResized에서 이상한 코드를 무시 .)

문제는 바로 브라우저 창이 r 플러그인의 가시 영역이 변경되거나 확장 프로그램이 스크롤 상자의 보이는 영역 외부로 스크롤되면 플러그인이 Chrome에서 충돌합니다. Firefox를 설치하지 않았지만 Internet Explorer에서 작동하기 때문에 NpApi라고 생각합니다.

나는 무슨 일이 일어나고 있는지, Chrome은 보이는 크기의 플러그인이 변경 될 때마다 새로운 HDC를 만들고 생성한다는 것을 믿습니다. 렌더링 컨텍스트가 유효하지 않지만 플러그인에서 여전히 사용되고 있으며 이로 인해 충돌이 발생합니다.

이 경우 NPP_SetWindow get이 호출되었지만 NpapiPluginModule_NPP.cpp에서는 해당 호출이 무시되므로이 이벤트에 연결할 방법이 없습니다.

Google을 몇 시간 동안 사용해 보았지만 도움이 필요하지 않습니다. 누구든지이 경험이 있습니까?

내 자신의 DC를 처리 할 수있는 플러그인 창에서 내 자식 창을 만든 경우 작동 할 수 있다고 생각합니다. 아마 실패한 Win32 기술 덕분에 실패한 빠른 테스트를했습니다. 그러나 이것이 더 많은 일을 할 수 있을까요? 내가 가지고있는 또 다른 생각은 어떻게 든 가시 영역을 추적하는 것이지만, 아직 보지 못했습니다.

+0

이 부분을 간략히 살펴 보았으나, 더 깊이 파고 들어갈 시간은 없었습니다. OGL을 그리기없이 설정하는 것만으로 FF 및 Chrome에서 발생하며 out-of-process-plugins이 비활성화 된 경우에는 FF에서 발생하지 않습니다. FBs 창 하위 클래스를 사용하지 않으면 도움이되지 않습니다. Microsoft 심볼 서버가 구성된 Visual Studio를 연결합니다 ([Mozillas] (https : //developer.mozilla 등).org/ko/Using_the_Mozilla_symbol_server) 또한 일부 윈도우 프로세스 처리에서 스택 오버플로가 발생하여 충돌한다는 것을 알 수 있습니다 (무한 재귀). BTW,'SetWindow'는'FB :: NpapiPluginWin'을 거칩니다. –

답변

1

Windows 핸들이 잘못되어 프로그램이 충돌을 일으켜서는 안됩니다. 그러나 OpenGL, 즉 호스트 프로그램이 OpenGL을 사용하는 경우 확장 프로그램에 특별한주의가 필요합니다.

OpenGL을 사용하는 모든 종류의 플러그인 또는 DLL은 필요한 리소스를 사용하기 전에 필요한 리소스를 사용하기 전에주의를 기울여야합니다.

HDC hOldDC = wglGetCurrentDC(); 
HRC hOldContext = wglGetCurrentContext(); 

// first unbind old context/DC from current thread 
wglMakeCurrent(NULL, NULL); 

// then bind our context 
wglMakeCurrent(hMyDC, hMyContext); 

// this is essential, as in Windows the addresses of extensions 
// may depend on the active context, so you must reinitialise 
// extension function pointers! 
reinitialize_extensions(); 

/* NOW USE OPENGL FUNCTION 

// cleaning up once we're done: 
wglMakeCurrent(NULL, NULL); 
wglMakeCurrent(hOldDC, hOldRC); 
// remember that we also need to reset extension 
// function pointers to the other context 
reinitialize_extensions(); 

확장 함수 포인터는이 구조에 넣어 그 하나를 통해 그들을 호출 할 의미가 문맥에 따라 창에서 이후 : OpenGL을 위해 이것은 당신이 당신의 문맥을 리 바인드해야 그것을 사용하기 시작 매번 전에 의미한다. 이렇게하면 전체 확장 재 초기화 작업이 저장됩니다. C++에서는이를 위해 클래스에서 전체 OpenGL 컨텍스트를 래핑 할 수 있습니다.

NP-API를 통해 플러그인이 호출 될 때마다이 setup/teardown을 거쳐야한다는 것을 기억하십시오.

+0

호기심에서 벗어난 무효화 된 확장 포인터로 인해 실제로 문제가 발생 했습니까? 나는이 문제없이 Windows에서 GL을 수년간 해왔지만 헌신적 인 하드웨어 덕분에 운이 좋았을 수도 있고 여러 동시 컨텍스트가 너무 자주 엉망이되지 않았을 수도 있습니다. – rotoglup

+0

OP는 별도의 스레드에 OpenGL 설정 및 드로잉 코드가 있으며 [docs] (http://msdn.microsoft.com/en-us/library/dd374387(v=vs.85) .aspx)에서는 스레드 당 하나의 현재 GL 컨텍스트 가져 오기 –

+0

@ GeoFritzsche : OP가 내 충고를 따른다면, 그는 멀티 쓰레딩 지원을 얻습니다. OpenGL 멀티 쓰레딩에 대한 요지는 컨텍스트가 한 번에 하나의 스레드에서만 활성화되어야하며 각 스레드는 정확히 하나의 컨텍스트를 가져야한다는 것입니다. 그러나 컨텍스트는 스레드간에 완벽하게 마이그레이션 할 수 있습니다. 위의 코드는 다중 스레드 안전을 처리합니다. – datenwolf