首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Graphics.DrawString (而不是SpriteBatch.DrawString)呈现文本

使用Graphics.DrawString (而不是SpriteBatch.DrawString)呈现文本
EN

Stack Overflow用户
提问于 2015-01-25 13:21:36
回答 2查看 5.3K关注 0票数 14

使用Graphics.DrawString将(相当静态的)文本呈现到屏幕外位图,将其转换为Texture2D一次,然后只调用SpriteBatch.Draw,而不是使用内容管道和使用SpriteFont呈现文本,有什么坏处吗?这基本上是一页文字,画成一张“纸”,但用户也可以选择调整字体的大小,所以这意味着我必须包括不同大小的喷粉。

因为这是一个只使用Windows的应用程序(不打算移植它),所以我可以访问所有字体,就像一个普通的老WinForms应用程序一样,我相信使用Graphics.DrawString (甚至TextRenderer)的渲染质量会比使用雪碧字体要好得多。

而且,性能似乎会更好,因为SpriteBatch.DrawString需要在每次迭代中“呈现”整个文本(即分别发送每个字母的顶点),而通过使用位图,我只做了一次,所以在CPU端应该稍微少一点工作。

  1. 我在这里没有看到什么问题或缺点吗?
  2. 使用spritefonts可以获得alpha混合文本吗?我已经看到了提到过的Nuclex框架,但是它还没有移植到Monogame。

更新

从技术方面看,它似乎工作得很完美,比通过雪碧字体渲染文本要好得多。如果它们是水平呈现的,我甚至会得到ClearType。可能存在的一个问题是字体的spritesheets是(可能的吗?)在纹理内存方面,比为一页文本创建单独的纹理更有效。

EN

回答 2

Stack Overflow用户

发布于 2017-11-24 08:25:19

不是

,似乎没有什么不好的

实际上,您似乎遵循了一种标准的文本呈现方法。

与渲染纹理四角体相比,渲染文本“适当”是一个相对较慢的过程,即使SpriteFonts删除了所有的花键符号,如果您呈现的是一页文本,那么仍然可以占用大量的三角形。

每当我看到GL/XNA的不同文本呈现解决方案时,人们都倾向于推荐您的方法。将您的文本墙绘制一次到可重用的纹理,然后呈现该纹理。

您还可能希望将RenderTarget2D视为可移植的解决方案。

例如:

代码语言:javascript
复制
// Render the new text on the texture
LoadPageText(int pageNum) {
    string[] text = this.book[pageNum];
    GraphicsDevice.SetRenderTarget(pageTarget);
    // TODO: draw page background

    this.spriteBatchCache.Begin();
    for (int i = 0; i < text.Length; i++) {
         this.spriteBatchCache.DrawText(this.font, 
             new Vector2(10, 10 + this.fontHeight * i), 
             text[i], 
             this.color);
    }
    this.spriteBatchCache.End();
    GraphicsDevice.SetRenderTarget(null);
}

然后在场景渲染中,你可以用spriteBatch.Draw(..., pageTarget, ...)渲染文本。这样,你只需要一个纹理为您的所有网页,只要记住,也重新绘制,如果你的字体改变。

需要考虑的其他事情是SpriteBatches排序模式,有时这可能会影响呈现许多三角形时的性能。

在第2点,正如我前面提到的,SpriteFonts是预渲染的纹理,这意味着透明度被烤到了它们的spritesheet上。因此,默认库似乎不使用透明/反混叠。

如果您在黑色上渲染它们的两倍大和白色,并使用SourceColor作为一个alpha通道,然后使它们缩小,与Color.Black混合使用,您可以将其恢复。

票数 2
EN

Stack Overflow用户

发布于 2017-11-24 15:13:20

请尝试使用指针混合颜色:

代码语言:javascript
复制
MixedColor = ((Alpha1 * Channel1) + (Alpha2 * Channel2))/(Alpha1 + Alpha2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28136874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档