2011-01-21 61 views
2

我即将在MFC中启动文本呈现窗口。鉴于文本渲染窗口将允许不同风格的字体(并且每个窗口可以有不同的字体),我一直在考虑字体的管理。管理MFC中的字体,笔刷和笔

创建某种字体管理器有意义吗?我在想,每次需要字体时,渲染器都会将所需的LOGFONT传递给经理。如果CFont存在,它将被返回,如果没有,则创建。这个字体管理器在系统中是全局的。

这是矫枉过正? Windows是否会在这种情况下做这种事情,这意味着从应用程序的角度来看它完全不是必需的?

人们也可以说,对于特定颜色的画笔和笔也是如此。一旦创建了某种类型的管理器,将它们存储到某个管理器中会更快吗?例如,如果我创建了一个坚固的淡紫色画笔,是否需要另一个需要淡紫色的窗口请求现有画笔?另外,我猜如果我加载磁盘上的图像blit,如果两个独立的窗口从磁盘加载相同的图像,我会有两个图像 - 所以这些是缓存的好候选者(按文件名,或许?)

回答

2

这是一个好的字体策略,Windows字体映射器并不便宜,而且典型程序使用的字体数量是有限的。但不适用于刷子和笔,它们很便宜,只需在飞行中创建并销毁即可。

该策略的最终认可来自微软自己的代码,Winforms做到了这一点。请注意,缓存会产生新问题,用户更改系统设置时必须使缓存失效。系统颜色,DPI等等。您必须在顶层窗口中监听WM_SETTINGCHANGE。

0

Windows有/已经有一段时间(因为我为Windows编程)有GetStockXXX函数,如GetStockFont()。我有一个快速的谷歌,但没有明显的MSDN文档出现。

编辑:见GetStockObject():http://msdn.microsoft.com/en-us/library/dd144925%28VS.85%29.aspx

+0

嗨,詹姆斯,是的,我知道GetStockXXX函数。但是,这仅适用于库存对象(基本字体和笔刷),而不是自定义颜色或用户从字体选择对话框中选择的字体(例如(以及随后应用于该字体的任何样式,如Bold,Italic &下划线)。 – 2011-01-21 12:19:28

3

Windows版本的不同做了不同的这些事情缓存量。

我的建议取决于两件事情:

  1. 不要过早优化。如果您将来可能需要优化,请继续并确保将其设计为从字体管理器检索字体。但是,直到有可证明的性能赤字,不要打扰执行缓存。

  2. 措施。制作一个测试用例程序,可以创建并销毁数百种不同风格的字体,并测量其在性能上的比例。

我曾经花了很长时间写一个多线程渲染器。只是为了发现这一点,因为无论如何,GDI驱动程序将硬件访问序列化,所以我没有得到任何好处。