2010-01-15 2 views
1

많은 양의 텍스트가 포함될 수있는 주석이 달린지도를 표시하는 MFC 응용 프로그램이 있습니다. 텍스트의 크기와 글꼴이 많이 변경되지는 않지만 텍스트의 회전은 주변 선 작업과 정렬되도록 상당히 다양합니다. 이것은 기본적으로 회전을 변경할 때마다 디스플레이 컨텍스트에 새 글꼴을 만들고 선택해야한다는 것을 의미합니다. 뭔가가 좋아.MFC에서 회전 된 텍스트 출력 속도를 높이는 방법

if (TextRotationChanges) 
{ 
    m_pFont = new CFont; 
    m_lf.lfEscapement = NewRotation; 
    m_pFont->CreateFontIndirect(&m_lf); 
} 
CFont *OldFont = m_pDC->SelectObject(m_pFont); 
m_pDC->TextOut(x,y,text,strlen(text)); 
m_pDC->SelectObject(OldFont); 

많은 양의 텍스트를 처리 할 때 분명히 느립니다. D3D 또는 OpenGL과 같은 다른 디스플레이 엔진을 사용하지 않고이 속도를 높이는 방법이 있습니까? 다른 말로하면, 기존 선택한 글꼴에서 텍스트 회전을 변경할 수 있습니까?

n.b. 텍스트를 화면에 표시하려고 시도하기 전에 눈에 보이는 크기로 텍스트를 표시하는 것과 같은 다른 명백한 최적화를 이미 수행하고 있습니다.

답변

1

많은 GDI 개체를 생성하고 파괴하는 속도가 느려질 수 있습니다. 할 수있는 일은 프로그램 시작시에 360 개의 글꼴을 작성하는 것입니다. 사전 정의 된 글꼴을 원하는 순서대로 사용하여 찾아보기 테이블에서 SelectObject()를 주문형으로 작성할 수 있습니다. 또는 lfEscapement를 사용하지 않고 적절한 회전 행렬과 함께 SetWorldTransform()을 사용하여 텍스트를 회전 할 수 있습니다 (다시 말하면 속도에 대한 회전 행렬을 캐시 할 수 있습니다). 실제로 속도가 향상되는지 테스트해야합니다.

여기에 내 질문보기 SetWorldTransform() and font rotation 문제는 (내가 돌아가서 살펴볼 시간이 없었지만) 그 접근 방식과 관련되어있었습니다.

+0

+1 각 회전 각도에서 글꼴 배열을 사전 생성하는 데 +1은 전혀 생각하지 않았지만 시도해 보겠습니다. 이런 유형의 접근법을 사용하면 GDI 리소스 제한에 위배 될 수 있습니다. –

+0

당신이 GDI 핸들 제한을 치고 있다면 그 주위에 어떤 방법도 보이지 않습니다 - 기본값은 10k입니다, 360은 그 중 작은 비율입니다, 나는 그것이 가능할 것이라고 생각합니다. X에 가장 자주 사용되는 회전 (X는 항상 <360)을 저장하고 캐시에없는 회전이 요청 될 때 가장 자주 사용되지 않는 회전을 대체하는 캐시 개체를 작성할 수 있다고 생각하지만이 많은 부기 보람있는 게임을 만들기 위해 너무 많은 속도를 낼 수 있습니다. 2, 3 또는 5의 배수로 모든 회전을 클립 할 수 있다고 생각합니다. mem reqs에 의존하십시오. 나는 그것이 시각적으로 문제가 될지 의심 스럽다. – Roel

0

먼저 보이지 않는 DC에 그려야하며 DC에 복사해야합니다.

1

TextOut이 아닌 글꼴 문제인지 확인하십시오.
깜박임을 피하려면 Oleg의 백 버퍼 사용 아이디어가 나쁘지 않습니다.

그래픽 엔진을 사용하려고한다면 특별히 Cairo을 시도 할 것입니다. 그 종류의 작업을 위해 특별히 설계 되었기 때문입니다.
(직접 win32 DC 표면에 렌더링 할 수 있음)

관련 문제