Direct2D界面和模糊文本问题

时间:2011-09-21 10:56:12

标签: c++ windows gdi direct2d

我的新应用程序将具有丰富的界面,应该可以动态调整大小使用透明图标/图像等。对于这个应用程序,我正在尝试决定使用新的Direct2D API对抗旧的GDI。其中一个缺点当然是它不能在XP上运行,尽管我发现了一些更糟糕的问题需要决定:

  1. 我注意到在Direct2D环境中输出文本似乎有点模糊(尽管作为一项功能推出)。只需查看启用了硬件加速(或IE9)的Firefox 4中的文本。这似乎是因为在Direct2D文本does not adhere to the (pixel) grid中像GDI那样。有没有办法强制Direct2D使其坚持像素网格,从而解决这个问题?

  2. 速度真的有这么好吗?我试着理解this文章,我从中得到的是,在Windows 7和XP(不是Vista?)中,GDI已经硬件加速了。例如。在我的应用程序中,我使用了很多内存DC,只是BitBlt编辑到位,并使用AlphaBlend绘制绘制透明图像/消除锯齿线等。最后一个肯定是硬件加速,因为我在测试我的例程时测量速度。

  3. 那你要把钱放在哪里? Direct2D是值得的麻烦还是你只是坚持好老的GDI?或者你会建议其他什么?

    注意:我正在用C ++编程btw,没有使用MFC。

2 个答案:

答案 0 :(得分:4)

解决问题非常简单。 Direct2D具有高度可配置性,包括文本呈现和提示。如果你想让它渲染文字以匹配GDI的渲染(即非常紧凑的像素对齐),那就是:

由于另一个答案是最无用的,并且在Direct2D中进行渲染,让我提供另一个Direct2D文本渲染的概述。这非常非常好。与Mac上不同的是,它们基本上没有提示字体并且文本实际上是模糊的,默认情况下Direct2D仅在Y方向强烈暗示。这是有道理的,因为你的显示器可能垂直大约96 dpi,但是对于亚像素抗锯齿,水平分辨率超出了合理的人类感知范围。它的ClearType使用和提示也比GDI更微妙。与Direct2D相比,GDI文本的边缘往往非常丰富多彩。我现在发现GDI文本看起来很苛刻,并且更喜欢Firefox和IE中的Direct2D文本进行长时间阅读。

因此,有几个原因导致默认模式对您来说可能显得“模糊”。

  1. 首先,花些时间在控制面板中运行ClearType调谐器程序。你会对Direct2D程序的不同感到惊讶。
  2. 无论它有多好,当您将它放在应用程序中的GDI间隔文本旁边时,它总是会显得很奇怪。尝试在UI中创建所有内容,或者清楚地区分内容区域与其他区域。如果您决定使所有GDI间隔,只需使用我上面描述的方法将Direct2D设置为GDI间隔文本模式。
  3. 您尚未安装Windows Update中的所有可用更新。 DirectWrite和IE有几个。确保全部安装并重新启动以查看改进。
  4. 你还没有习惯它。
  5. 这是你的想法。真。一旦你开始考虑文本渲染很多,你可能会发现自己注意到那些不存在的“问题”。这个问题的另一个答案是完美的例子。他声称他认为Visual Studio 2010中的文本比2008年更加模糊,但它们实际上是像素完美副本。不相信我? VS开发人员实际上自己提供了一些比较。我打赌你不能分辨出来。 http://blogs.msdn.com/b/text/archive/2010/03/05/additional-wpf-text-clarity-improvements.aspx

答案 1 :(得分:1)

同样多的软件依赖于摩尔定律的不可避免的进展来提供越来越多的马力,GDI +和Direct2D似乎是基于屏幕分辨率(像素密度)将继续提高的事实。但事实是,像素密度没有显着增加,并且从表面上看,已达到稳定水平。

GDI文本的设计假设决议很糟糕。像素对齐,提示和后来的子像素渲染(例如ClearType)都是精心设计的折衷方案,它们以每英寸75-100像素的可读性的实际约束来衡量任意变换(如缩放和旋转)的一般性。 / p>

如果我们的屏幕的像素密度接近现代打印机可以产生的像素密度,我很乐意放弃这些妥协,转而采用普遍性。但我们不在那里。我们甚至都不亲近。就个人而言,我发现VS 2010中的编辑器远不如VS 2008中的编辑器那么可靠。

需要考虑的事项:您是否需要担心屏幕以外的其他设备?打印机? Direct2D是否处理打印机或者您是否必须实施GDI解决方案? Windows XP有多重要?您希望未来的证据如何? Direct2D显然是微软试图让每个人都感动的方向。

不考虑的事情:速度。我还没有看到任何现代应用程序受限于将文本呈现到屏幕的速度,无论技术如何。这是一条高度优化的道路。实际布局可能比设置屏幕上的像素值更加瓶颈。如果您要为全屏缩放设置动画,则可能需要Direct2D - 不是为了速度,而是为了一般变换和平滑缩放。