1

注釈付きマップを表示する 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 などの別のディスプレイ エンジンに行かずにこれを高速化する方法はありますか? 別の言い方をすれば、既存の選択したフォントのテキストの回転を変更できますか?

nb テキストを描画する前に、テキストが目に見えるサイズで画面に表示されるようにするなど、他の明白な最適化を既に実行しています。

4

3 に答える 3

1

多くのGDIオブジェクトの作成と破棄には時間がかかる場合があります。プログラムの起動時に360フォントを作成して、オンデマンドで作成するのではなく、事前に作成されたフォントを正しい回転で使用してルックアップテーブルからSelectObject()を実行できるようにします。または、lfEscapementを使用せずに、適切な回転行列でSetWorldTransform()を使用してテキストを回転させることもできます(ここでも、回転行列をキャッシュして速度を上げることができます)。それが実際にあなたにスピードゲインを与えるかどうかをテストする必要があります。

ただし、このアプローチで発生した/発生した問題については、 SetWorldTransform()とフォントの回転に関する質問を参照してください(戻って調査する時間がありませんでした)。

于 2010-01-15T15:17:46.647 に答える
1

Are you sure that the problem is the font and not the TextOut?
Oleg's idea of using a back buffer isn't bad if you want to avoid flickering.

If I was going to use a graphic engine I'd try Cairo because it's designed specifically for that kind of jobs.
(it can render directly on win32 DC surfaces)

于 2010-01-15T10:37:38.377 に答える
0

まず目に見えない DC に描画してから、DC にコピーする必要があります。

于 2010-01-15T10:23:49.870 に答える