그래서 .NET에서 SharpDX를 사용하여 DirectX 개발을 수행하고 있습니다 (그러나 DirectX / C ++ API 솔루션이 적용 가능합니다). DirectX를 사용하여 직교 투영 (예 : 과학 응용 프로그램의 2D 선 그리기 시뮬레이션)에서 선을 렌더링하는 가장 빠른 방법을 찾고 있습니다.
렌더링하려는 플롯 종류의 스크린 샷은 다음과 같습니다.
이러한 종류의 플롯이 라인 당 앤티 앨리어싱 (또는 전체 화면 AA 켜기 / 끄기)이 있거나없는 수백만 개의 세그먼트, 가변 두께의 라인을 갖는 것은 드문 일이 아닙니다. 선의 꼭짓점을 매우 자주 (예 : 20 회 / 초) 업데이트하고 가능한 한 GPU로 오프로드해야합니다.
지금까지 나는 시도했다 :
- 소프트웨어 렌더링, 예를 들어 GDI +는 실제로 성능이 좋지 않지만 CPU에서 분명히 무겁습니다.
- Direct2D API-특히 앤티 앨리어싱을 사용하는 경우 GDI보다 느립니다.
- 이 방법을 사용하여 Direct3D10 은 CPU 측에서 정점 색상 및 공간 분할을 사용하여 AA를 에뮬레이션 합니다. 또한 느리게 (프로필을 작성했으며 정점 위치를 계산하는 데 80 %의 시간이 소요됨)
세 번째 방법에서는 정점 버퍼를 사용하여 삼각형 스트립을 GPU에 보내고 200ms마다 새로운 정점으로 업데이트합니다. 100,000 개의 선 세그먼트에 대해 약 5FPS의 화면 주사율을 얻고 있습니다. 이상적으로 수백만이 필요합니다!
이제 가장 빠른 방법은 예를 들어 Geometry Shader와 같은 GPU에서 테셀레이션을 수행하는 것입니다. 정점을 라인리스트로 보내거나 텍스처로 묶고 Geometry Shader에서 압축을 풀어 쿼드를 만들 수 있습니다. 또는 픽셀 쉐이더에 원점을 보내고 Bresenham Line drawing을 픽셀 쉐이더로 구현하십시오. 내 HLSL은 2006 년부터 녹슨 쉐이더 모델 2이므로 현대 GPU가 할 수있는 미친 것들에 대해 잘 모릅니다.
그래서 질문은 :-누구든지 전에 이것을 한 적이 있습니까, 시도해 볼 제안이 있습니까? -지오메트리를 빠르게 업데이트하여 성능을 개선 할 수있는 제안이 있습니까 (예 : 20ms마다 새로운 정점 목록)?
1 월 21 일 업데이트
이후 LineStrip 및 Dynamic Vertex Buffers를 사용하여 Geometry 쉐이더를 사용하여 위의 방법 (3)을 구현했습니다. 이제 100k 포인트에서 100FPS를, 1,000,000 포인트에서 10FPS를 얻습니다. 이것은 크게 개선되었지만 이제는 채우기 속도와 계산이 제한되어 있으므로 다른 기술 / 아이디어에 대해 생각했습니다.
- 라인 세그먼트 형상의 하드웨어 인스 턴싱은 어떻습니까?
- 스프라이트 배치는 어떻습니까?
- 다른 (픽셀 셰이더) 지향 방법은 어떻습니까?
- GPU 또는 CPU를 효율적으로 제거 할 수 있습니까?
귀하의 의견 및 제안에 감사드립니다!