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)的情况下加快速度?换句话说,我可以更改现有选定字体的文本旋转吗?

注意,我已经在进行其他明显的优化,例如在尝试绘制之前确保文本在屏幕上以可见大小显示。

4

3 回答 3

1

您确定问题出在字体而不是TextOut?
如果您想避免闪烁,Oleg 使用后台缓冲区的想法还不错。

如果我要使用图形引擎,我会尝试Cairo,因为它是专门为这类工作设计的。
(它可以直接在win32 DC表面上渲染)

于 2010-01-15T10:37:38.377 回答
1

创建和销毁许多 GDI 对象可能很慢。您可以做的是在程序启动时创建 360 字体,这样您就可以从查找表中选择正确旋转的预制字体,而不是按需创建它们。或者您可以不使用 lfEscapement 而是使用带有适当旋转矩阵的 SetWorldTransform() 来旋转文本(同样,您可以缓存旋转矩阵以提高速度)。您必须测试它是否真的会给您带来速度增益。

请在此处查看我的问题SetWorldTransform() 和字体旋转,以了解我在该方法中遇到/遇到的问题(还没有时间回去研究它)。

于 2010-01-15T15:17:46.647 回答
0

你应该首先在隐形 DC 上绘制它,然后复制到你的 DC。

于 2010-01-15T10:23:49.870 回答