2012-11-05 2 views
9

새 프로젝트를 시작하려고합니다. WPF와 OpenGL을 사용하는 것은 그 중 일부입니다.OpenTK, SharpGL 및 WPF

그러나 OpenGL 옵션을 OpenTK 또는 SharpGL 중 두 가지로 제한했습니다. SharpGL에는 WPF 컨트롤이 있지만 OpenTK에는 Windows Forms 컨트롤 만 있으므로 Windows Forms 호스트에 포함해야합니다. -/ 공역 제한은 신경 쓰지 않지만 괜찮은 성능을 유지하고자합니다. , 이후 실시간 응용 프로그램을 구축하고 있습니다. 게임이 아니지만 여전히 실시간입니다.

"순수한"WPF 컨트롤을 사용하여 SharpGL을 사용하는 것보다 Windows Forms 호스트를 통해 OpenTK를 사용하기 위해 내 프로그램에서 성능에 미치는 영향은 어느 정도입니까?

+0

D3DImage interop을 통해 WPF + DX 대 WinForms + DX를 테스트했습니다. DX + Winforms는 훨씬 빠릅니다. WPF D3DImage를 사용할 때 렌더링 엔진에 통합하기 위해 필요한 복사 작업 때문에 성능에 문제가 있습니다. 나는 OpenGL에도 똑같이 적용 할 것이라고 생각한다. – Alan

+0

'Windows Forms Host'의 사용은 IMHO의 나쁜 해결책이다. 오버 드로를 지원하지 않기 때문에 이것을 일반 컨트롤로 포함 할 수 없습니다. –

답변

5

성능면에서 볼 때 실제로는 하나의 답변 만 제공 할 수 있습니다. 직접 벤치 마크를 수행하십시오! 하지만 정교한 추측을 요구하고 같이

SharpGl을 는 밖으로 나갈 때 윈도우는 "중간"블리트 대상으로 호스트 Forms 컨트롤, 간접 단계를 덜 필요로한다. 소금 한 알을 가지고 이것을 가져 가라. 나는 근원을 보지도 않았고 직접 시험하지도 않았다.

하지만 실질적으로 말하면 성능은 매우 비슷해야합니다. 하루가 끝나면 계산량이 많은 작업이 OpenGL에서 수행되는 렌더링 자체 일 것입니다. 완성 된 결과를 블 리팅하는 것은 그 시간의 일부분 만 취해야합니다. 따라서 이러한 옵션 중 어느 것도 성능에 큰 타격을 줄 수는 없지만 귀하가 결정하기를 바랍니다.

인수를 위해 : 렌더링 자체 (OpenGL 부분)는 16ms가 걸리므로 대략 60FPS의 이론적 성능을 갖습니다. 프레임 워크 A는 1ms의 오버 헤드를 추가하고 프레임 워크 B는 4ms의 오버 헤드를 추가합니다. 오버 헤드가 상당히 큰 차이가 있더라도 프레임 워크 a는 ~ 58FPS로, 프레임 워크 B는 ~ 50FPS로 렌더링됩니다. 따라서 두 경우 모두 응용 프로그램을 사용할 수 있어야합니다.

하지만이 문제에 대해 궁금해하는 점이 무엇입니까? 결국에는 OpenGL을 사용하여 작업하고 있으며 상황이 좋지 않을 경우를 대비해 기본 구현을 간단히 전환하는 것이 번거롭지 않아야합니다. 인터페이스는 나에게 너무 다른 것처럼 보이지 않습니다.

+0

나는 히트가 작다고 생각하지 않는다 : WPF는 하드웨어 가속으로부터 이익을 얻는다. winforms는 그렇지 않다. –

+3

내 생각 엔 당신이 빠뜨린 것 같아요. 주요 작업은 하드웨어 가속화가 필요한 OpenGL에서 수행됩니다.OpenGL 출력에서 ​​"브리지"하려면 "결과"이미지가 다양한 표면 위에 단순히 blitted됩니다. 그리고 이러한 blitting 작업은 렌더링에 필요한 시간의 일부만 소요됩니다. 아, 그리고 WPFs 하드웨어 가속이 훨씬 여기 구입하지 않습니다. WPF에서 OpenGL 이미지에 액세스 할 가능성이 있다고 생각하지 않으므로 "소프트웨어"복사본을 만들어야합니다. –

+0

내 포인트를 명확하게하기 위해 몇 가지 숫자를 추가했습니다. –

4

OpenTK를 사용하거나 SharpGL을 사용하는 것이 더 편한 경우 Winforms 모드로 이동하여 WPF 응용 프로그램에 포함 시키십시오.

이유는 OpenGL 드라이버가 모든 winforms 컨트롤과 함께 제공되는 창 핸들로 작업하는 방법을 알고 있기 때문입니다. WPF 응용 프로그램에는 주 윈도우 중 하나 인 창 핸들 만 있습니다. 당신은 그것을 사용하려고 할 수도 있지만 너무 많은 문제를 일으킬 것이라고 생각합니다.

PixelBufferObject 또는 RenderBufferObject를 사용하여 화면에 직접 렌더링하지 않으려면 SharpGL을 WPF 모드로 사용하는 것보다 좋습니다 (RenderBufferObject로 렌더링 함). 아마도 WritableBitmap 등을 사용하여 이미지 버퍼를 만들거나, 같은 일을 스스로 할 수 있습니다.

관련 문제