2008-09-16 3 views
12

불규칙한 격자에 많은 수의 작은 문자열을 표시하는 C# Windows Forms 응용 프로그램의 텍스트 렌더링을 최적화해야합니다. 언제든지 초당 4 번 업데이트 할 수있는 5000 개 이상의 셀이 표시 될 수 있습니다. 폰트 패밀리와 크기는 셀간에 일관성이 있지만 색상은 셀마다 다를 수 있습니다 (굵게/기울임 꼴/일반).Windows Forms에서 텍스트를 렌더링하는 가장 빠른 API는 무엇입니까?

내가있는 TextRenderer.DrawTextGraphics.DrawString에 대해 웹에서 정보를 충돌 본 적이 가장 빠른/최고에, Win32 수준에서 GDIGDI+ 비교를 줄일 수있다.

나는 Windows XP와 Windows Vista에서 근본적으로 다른 결과를 보았지만 주요 목표는 Windows XP입니다. 위대한 진보를 약속하는 기사 아래의 WinFXDirectX 10은 여기에 도움이되지 않습니다 :-)

가장 좋은 방법은 무엇입니까? 나는 작은 C++/CLI 레이어를 도입하고 더 나은 성능을 끌어 내기 위해 장치 컨텍스트 처리를 최적화하는 것을 두려워하지 않지만 어떤 방향으로 나아갈 지에 대한 확실한 조언을 원합니다.

편집 : 초기 답변을 보내 주셔서 감사합니다. 나는 배경 비트 맵 렌더링과 GDI 동등한 호출을 고수하려고 노력할 것입니다.

답변

5

Microsoft 개발자는 자신의 블로그에 원시 속도 질문에 대답하는 GDI vs. GDI+ Text Rendering Performance 문서를 게시했습니다. 시스템에서 GDI DrawText는 GDI + DrawString보다 약 6 배 빠릅니다.

진정한 속도의 악마가 필요한 경우 TextOut은 DrawText보다 빠르지 만 자르기와 단어 자르기는 스스로 처리해야합니다. ExtTextOut은 클리핑을 지원합니다.

GDI 렌더링 (TextRenderer)은 GDI를 사용하는 Windows의 다른 부분과 더 일관성이 있습니다. GDI +는 장치 독립적 인 것으로 시도하므로 some spacing and emboldening are inconsistent입니다. 불일치 렌더링 예제는 SQL Server 2005 노출 영역 구성 도구를 참조하십시오.

+0

블로그 링크의 샘플 앱은 Vista와 XP의 큰 차이점을 보았을 때 사용했던 도구입니다. Vista PC, GDI 및 GDI +는 동일하지만 XP에서는 저자가 언급 한 6x의 차이를 볼 수 있습니다. 이것은 아마 비스타 드라이버 문제이지만, 여기에 몇 가지 어려움을 강조 표시합니다 - 감사합니다! –

+1

기록 참고 사항 : ExtTextOut는 가장 빠른 방법으로 일부 카드/드라이버에서 단색 사각형을 그리는 데 사용되었습니다. –

2

GDI는 일반적으로 GDI +에서 그리기가 더 빠릅니다. 저는 수천 개의 라인과 텍스트 문자열을 가져와 GDI +에서 GDI로 전환해야하는 프로젝트에서 상당한 성능 향상을 이루었습니다. Windows XP를 사용하고 있었기 때문에 Vista에 대해서는 언급 할 수 없습니다. 또한 성능 향상을 위해 드로잉에 이중 버퍼링을 사용하는 것이 좋습니다. 화면 비트 맵과 호환되는을 만들고 그릴 때마다 다시 사용할 수 있습니다.

3

5000+ 텍스트 렌더링은 특히 스크롤이 필요한 경우 GDI를 사용하는 경우에도 느립니다. 별도의 렌더링 스레드를 만들고 UI 스레드에 200ms마다 알림을 보내고 현재 결과를 bitblt하십시오. 그것은 부드러운 사용자 경험을 제공합니다.

2

네이티브 코드로 드로잉을 수행하기 위해 C++/CLI interop 클래스를 생성하면 매우 빠르게 드로잉 할 수 있습니다. 우리는 이것을 목격하고 그것을 측정했습니다.

그 일을 제대로하지 않았다면 graphics.DrawString이 TextRenderer.DrawText보다 약간 빠릅니다.

2

내 Windows 7 64 비트 시스템에서 TextOut은 DrawString보다 약간 느립니다! TextRenderer.DrawText는 DrawString보다 훨씬 느립니다.

+1

나는 또한 이것을 발견했지만 ... 어떤 이유인지 찾을 수 없습니다!? – series0ne

관련 문제