MFC 응용 프로그램에서 스크롤 막대를 드래그하여 문서를 부드럽게 스크롤하는 동안 텍스트 단락이 들어있는 블록이 켜지면 프레임 속도가 고르지 못한 수준으로 떨어집니다. 스크린이지만, 화면이 꺼지면 부드럽습니다. 퍼포먼스를 조사한 결과, 단 하나의 텍스트 단락이 발생했음을 알게되었습니다. CDC::DrawText
. 이것은 최적화 된 릴리스 빌드입니다.Win7 x64의 DrawText 성능이 좋지 않음
나는 다음과 같이 단지 DrawText에 호출의 고해상도 측정을 얻기 위해 QueryPerformanceCounter
을 사용 :
QueryPerformanceCounter(...);
pDC->DrawText(some_cstring, some_crect, DT_WORDBREAK);
QueryPerformanceCounter(...);
텍스트 유니 코드,가 lorem-ipsum의 스타일 필러, 긴 865 자이며 (7)을 통해 랩 사각형 및 글꼴 (Segoe UI, lfHeight
= -12, 표준 본문 텍스트 크기)이 주어진 비트 라인. 내 측정에서 만 전화하면은 평균 7.5ms, 홀수 피크는 21ms입니다. (당신은 약 16ms 각 업데이트를 렌더링을 얻을 60Hz의 모니터를 계속합니다.)
나는 성능 향상을 위해 몇 가지 변화를 시도 :
DT_WORDBREAK
약이 1ms (약 7 성능을 향상 제거를 시간이 빠름). 단 한 줄의 텍스트 만 화면에 표시되고 단어 분리가 7 줄이 넘는 경우 병목 현상이 다른 곳에서 발생한다는 것을 알 수 있습니다.- 텍스트를 투명 모드 (
SetBkMode(TRANSPARENT)
)로 그렸습니다. 그래서 단색 배경 채우기로 불투명 모드를 시도했습니다. 개선 없음. - ClearType 렌더링이 문제가 될 수 있다고 생각했습니다. 글꼴
lfQuality
을CLEARTYPE_QUALITY
에서NONANTIALIASED_QUALITY
으로 변경했습니다. 날카로운 모서리와 모든 것, 그리고 아무런 개선이없는 쓰레기처럼 보였습니다. - 의견 제안에 따라 CMemDC를 사용하고 있었지만이를 제거하고 직접 그리기를 수행했습니다. 그것은 미친 듯이 깜박이며 개선되지 않았습니다.
이것은 Intel Core 2 Duo P8400 @ 2.26GHz 및 4GB RAM이 장착 된 Windows 7 64 비트 노트북에서 실행됩니다. 느린 시스템으로 간주되지 않습니다.
DrawText()를 호출 할 때마다 DrawingText()가 호출되므로 느린 함수로 성능이 저하됩니다. 특히 여러 텍스트 블록이 동시에 표시되는 경우에는 더욱 그러합니다. 경험을 부진하게 만드는 것으로 충분합니다. 그러나 파이어 폭스는 훨씬 더 많은 텍스트를 가진 ClearType에서 이와 같은 페이지를 렌더링 할 수 있습니다. 내가 도대체 뭘 잘못하고있는 겁니까? 어떻게하면 실제 DrawText 호출의 성능 저하를 피할 수 있습니까?
하드웨어 가속을 변경하면 어떻게됩니까? – Dialecticus
Win7에서 오래된 학교 GDI (MFC에서 내부적으로 사용되는 것으로 추정 됨)를 사용하는 방법을 생각하면 좋지 않습니다. 내 조언은 GDI + 방식으로 전환하는 것입니다. (http://msdn.microsoft.com/en-us/library/ms535991(v=VS.85).aspx). 시도해보고 결과를 알려줄 수 있습니다. – Keynslug
본 적이 있나요? http://blog.m-ri.de/index.php/2009/02/15/slow-drawtext-performance-in-vista-and-windows-7-please-comment/ –