문제

C ++/CLI를 사용하여 간단한 GDI 기반 데이터 플로터를 작성했지만 특히 빠르지는 않습니다 (일부 기본 프로파일 링은 화면 렌더링이 문제임을 나타냅니다).

USERCONTROL의 하드웨어 가속을 활성화 할 수있는 방법이 있습니까? ... 또는 내가 고려할 수있는 다른 옵션이 있습니까?

우리는 관리되는 코드를 사용하고 있으므로 가능한 경우 솔루션을 CLI 호환해야합니다.

편집하다 도움이되는 경우 각각 2x2 픽셀 인 사각형의 스트립 (128 데이터 포인트)을 렌딩합니다. Graphics::FillRectangle - 더 좋은 방법이 있을까요?

도움이 되었습니까?

해결책

Managed DirectX는 얼마 동안 더 이상 사용되지 않았습니다. 당신은 정말로 그것을 사용하고 싶지 않습니다. 대신 사용해야합니다 Slimdx C ++/CLI로 작성된 DirectX SDK API의 오픈 소스 인터 로프 레이어입니다. Managed DirectX보다 낫고 전문가의 전문가 커뮤니티가 지원합니다. (저는 곧 그들과의 DirectWrite 지원을 개선하기 위해 노력할 것입니다.)

다른 팁

내 경험을 통해 GDI+를 사용하면 충분한 성능을 얻지 못할 것입니다. 간단한 그림의 경우에도 많은 오버 헤드가 있음을 빨리 알게 될 것입니다.

대안은 (당신이 언급했듯이) direct3d 일 것이거나 정기적으로 고려할 수 있습니다. GDI 시스템 호출로. 그것은 분명히 코드 플랫폼을 의존하지만 매우 빠를 수 있습니다. 나는 그것을 사용하여 좋은 결과를 얻었습니다.

그것은 모두 당신이 기꺼이 다루고 싶은 복잡성에 달려 있습니다. 기본 사항을 알아 내면 GDI는 비교적 쉽습니다. Direct3D는 조금 더 복잡합니다. Direct3D는 더 미래의 증거이지만.

GDI+가 성능이 좋지 않다는 것은 사실이지만, 1680x1050 해상도에서 ~ 30 프레임 PR에서 수천 개의 포인트로 그래프를 뱉을 수있는 작업 관련 프로젝트에서 GDI+ 플로터를 작성했습니다 (스크롤 그래프 ).

이것을 달성하기 위해서는 많은 튜닝이 필요했습니다.

  • 그리기 전에 모든 것을 하나의 단일 경로로 변환하십시오.
  • 백 버퍼를 사용하는 경우 Pixel Format Format32bpppargb와 함께 사용하면 2-4x가 속도가 빨라질 수 있습니다.
  • a로 경로를 그리는 경우 많은 수직선 (고주파 신호)의 대신 후면 버퍼의 수평선으로 그려서 화면에서 이미지를 회전시킵니다. 이미지를 회전시키는 데 특정 비용이 필요합니다.

시나리오에 어떻게 많은 최적화가 필요한지 알 수 없습니다. 128 개의 데이터 포인트는 아무것도 아닙니다. 이 포인트를 하나에 넣습니다 그래픽 스팟 그러나 차이를 만들 수 있습니다. 왜냐하면 그것은 마샬링 오버 헤드가 덜 의미하기 때문입니다.

그건 그렇고 우리는 어떤 해상도와 프레임 속도에 대해 이야기하고 있습니까?

Microsoft도 지금 가지고 있습니다 Direct2d, 하드웨어 가속화 된 2D 도면 :

Direct2D는 2D 지오메트리, 비트 맵 및 텍스트에 대한 고성능 및 고품질 렌더링을 제공하는 하드웨어로드, 즉시 모드, 2D 그래픽 API입니다. Direct2D API는 GDI, GDI+및 Direct3D와 잘 상호 작용하도록 설계되었습니다.

Windows 7/Server 2008 R2가 필요하지만 지원은 Vista/Server 2008을 통해 백업되었습니다. 플랫폼 업데이트:

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top