2011-07-06 4 views
1

저는 각 비트 맵을 ~ 50ms마다 계산해야하며 이미지 상자에 그림을 그려 양식에 표시해야합니다.XNA/DirectX를 사용하여 DrawImage/DrawLine

DrawImage/DrawLine을 사용하면이 이미지의 렌더링/페인팅 속도가 빠르지 않습니다.

XNA/DirectX를 사용하여 향상시킬 수있는 방법이 있습니까?

이 작업에 더 적합한 것은 어느 것입니까?

예가 무엇입니까?

답변

2

XNA는 백그라운드에서 DirectX를 사용합니다. ManagedDX는 XNA 때문에 중단되었으므로 C#에서는 일반 DirectX를 더 이상 사용할 수 없습니다. 예를 들어 slimdx이지만 대안이 있습니다. XNA는 directx를 사용하는 엔진에 더 가깝습니다. 필요한 것은 드로잉 성능이 실제 문제가 아니라 관리 된 메모리 작업 인 것처럼 보이는 낮은 수준의 접근 방식입니다. 하드웨어 가속을 사용하고 2D 렌더링에 더 적합한 Direct2D (또한 slimdx의 일부 임)를 사용하는 것이 좋습니다. this을 시도하고 비트 맵을 완전히 손으로 조작 할 수도 있습니다.

+0

사실 제 3 자 프레임 워크를 사용하지 않고서는 직접적인 해결책이 없습니까? – nr1

+0

@ nr1 XNA는 자사 프레임 워크입니다. WinForms에서 XNA를 사용하는 방법의 예를 보려면 App Hub에서 XNA WinForms 샘플을 찾아보십시오. –

+0

@ Nr1 마지막 링크를 참조하십시오. 비트 맵에 직접 쓸 수있는 옵션이 있습니다. 아마도 충분히 빠릅니다. 나는 당신의 문제가 드로잉 성능이 아니라, 관리되는 메모리가 액세스되고 수정되는 방식이라는 것을 확신합니다. 이미지를 채우기 위해 XNA, SlimDX 등을 사용하여 많은 오버 헤드를 얻게 될 것입니다 ... 적절한 최적화를 통해 정상적인 비트 맵을 사용하여 달성 할 수 있다고 확신합니다. 물론 비트 맵의 ​​크기에 따라 다릅니다. – dowhilefor

0

winforms 샘플과 비슷한 방식으로 xna를 사용하는 것에 동의합니다.

비트 맵을 렌더링하거나 SpriteBatch를 사용하지 않고 모든 선의 모든 끝점을 포함하는 동적 꼭지점 버퍼를 만들면 최상의 모양과 성능을 얻을 수 있다고 생각합니다. 그런 다음 DrawUserPrimitives()를 사용하고 PrimitiveType.param을 PrimitiveType.LineList로 지정하십시오.

이 모든 포인트를 GPU로 전송하여 GPU가 모든 과중한 작업을 수행하는 동안 모든 종류의 효과 (쉐이더)를 만들 수 있습니다.

앱 허브의 교육 섹션에있는 샘플 중 일부는 그리드를 만들기 위해 이러한 종류의 렌더링을 사용합니다. 마음에 떠오르는 것은 perPixelLighting sample입니다. 3D 공간에서 다소 작업해야 할 수도 있습니다 (또는하지 않을 수도 있음).

관련 문제