2013-11-26 8 views
1

여러 개의 "플러그인"- 모든 GUI에 OpenGL 기반의 DLL이 있습니다. 그것은 모두 잘 작동하지만, 내가 그들 중 많은 것을 열면, 문제가 발생합니다 ... (아래) ... 아주 오래된 ATI Radeon HD 4600을 가진 나의 주요 개발 기계에서 발생합니다. 그러나 통합 인텔 HD도 NVidia도없는 아주 현대적인 랩탑에서는 그렇지 않습니다.wglCreateContext는 많은 OpenGL 컨텍스트에서 "오류가 없다"는 GetLastError와 함께 NULL을 반환합니다.

A) wglCreateContext는 NULL 반환하지만 GetLastError 모든 것이 괜찮 말한다 발생할 수

2 일, 임의 보인다! 이 경우에는 CPU를 사용하는 에뮬레이션을 사용하여 백업 계획을 세웠습니다. 천천히,하지만 작동합니다 ...

불행하게도 ...

B) 액세스 위반이 내지 0xFFFFFFFFFFFFFFFF을 읽고 "aticfx64.dll"충돌합니다. 외관상으로는 ATI 운전사이다, 그러나 아무 방법도 이것에게서 멀리 얻는 아무 방법도 없다. ...

어떤 아이디어? 너무 많은 창이 열리는 것이 일반적이지는 않지만 여전히 처리 할 수 ​​있어야합니다. 내 주요 관심사는이 문제를 처리 할 수있는 한계 나 방법이 있는지입니다. 나는 이것이 2 개의 창문을 가지고 일어날 수 있다고 두려워한다 ... 그것은 단지 나쁘다.

답변

0

메모리 사용량을 확인하는 것이 좋습니다. 여러 창이 열리는 경우에만 발생하는 경우 할당이 성공했는지 여부를 확인하지 않는 드라이버 버그가 노출 될 수 있습니다 (메모리가 조각 나거나 메모리가 제한되어있을 때 할당이 실패 할 수 있음). wglCreateContext가 NULL을 리턴 할 때, 더 큰 용량의 메모리를 할당하려고 시도한다. 실패 할 경우, 그럴 수도있다.

또 다른 문제는 드라이버가 허용하는 것보다 더 많은 공유 된 컨텍스트를 사용하는 것일 수 있습니다. 이론 사양 (http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt)에 따르면 "임의의 수의 컨텍스트가이 방식으로 데이터를 공유 할 수 있습니다." 임의의 엄청난 수의 공유 컨텍스트를 사용하는 것은 사양의 먼지 투성이이며 잘 테스트되지 않을 수 있습니다. 이는 32 개 이상의 공유 컨텍스트를 사용하는 경우 일 수 있습니다 (공유 컨텍스트는 비트 마스크로 DWORD에 내부적으로 저장 될 수 있음). 공유 컨텍스트를 33 개 만들고 NULL이 반환되는지 여부를 확인하여이를 쉽게 확인할 수 있습니다.

+0

감사합니다. 처음에는 많은 메모리가 남아있는 것처럼 보입니다. 실제로 문제가있는 컴퓨터에는 다른 컴퓨터보다 많은 메모리가 있습니다. 아마도 제한 될 것이므로 제한된 수의 열린 컨텍스트를 확보 할 수 있도록 몇 가지 예방 조치를 취했습니다. 나는 공유하지 않을 것이라고 생각한다. 왜냐하면 많은 공유 된 상황에서 그렇게 함에도 불구하고, 그것은 다른 플러그인으로, 따라서 공유되지 않은 상황에서도 그렇게하기 때문이다. AMD는 그 점에 관해서 연락을 취했는데, 지금까지 나는 그것을 "상위 레벨"로 전달한다는 응답을 받았다. –

0

더 이상 HGLRC를 사용하지 않을 때 wglDeleteContext를 호출하는 것을 잊지 마십시오. 그렇지 않으면 메모리 누수가 발생하고 결국에는 ati에서 액세스 위반이 발생하게됩니다.
(이 문제를 발견 할 때까지 이상한 오류가 발생했습니다)