Lou*_*Lou 13 drawstring monogame spritefont spritebatch
使用Graphics.DrawString将一组(相当静态的)文本渲染到屏幕外位图,将其转换为Texture2D一次,然后简单地调用SpriteBatch.Draw,而不是使用内容管道并使用渲染文本,是否有任何缺点SpriteFont?这基本上是一页文本,绘制成"纸张",但用户也可以选择调整字体大小,这意味着我必须包含不同大小的spritefonts.
由于这是一个仅限Windows的应用程序(不打算移植它),我可以访问所有字体,例如普通的WinForms应用程序,我相信使用Graphics.DrawString(甚至TextRenderer)使用精灵字体时渲染质量会好得多.
此外,似乎性能可能更好,因为SpriteBatch.DrawString需要在每次迭代中"渲染"整个文本(即分别为每个字母发送顶点),而使用位图我只做一次,所以它应该稍微减少工作量CPU方面.
[更新]
从技术方面来看,它似乎比通过精灵字体更好地完成文本渲染.如果它们是水平渲染的,我甚至会得到ClearType.可能存在的一个问题是字体的spritesheets(可能是?)在纹理内存方面比为文本页面创建单独的纹理更有效.
小智 2
似乎没有任何缺点
事实上,您似乎遵循标准的文本渲染方法。
与渲染纹理四边形相比,“正确”渲染文本是一个相对较慢的处理过程,即使 SpriteFonts 剪切了所有样条字形,如果您正在渲染一页文本,那么您仍然可能会积累大量三角形。
每当我研究 GL/XNA 的不同文本渲染解决方案时,人们往往会推荐您的方法。将文本墙绘制一次到可重复使用的纹理,然后渲染该纹理。
您可能还想将RenderTarget2D视为可移植的可能解决方案。
举个例子:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
然后在场景渲染中,您可以spriteBatch.Draw(..., pageTarget, ...)渲染文本。这样,您的所有页面只需要 1 个纹理,只要记住在字体发生变化时也重新绘制即可。
其他需要考虑的事情是 SpriteBatches 排序模式,有时这可能会影响渲染许多三角形时的性能。
关于第 2 点,正如我上面提到的,SpriteFont 是预渲染纹理,这意味着透明度被烘焙到它们的 spritesheet 上。因此,默认库似乎不使用透明度/抗锯齿。
如果您将它们渲染为两倍大,并使用 SourceColor 作为 Alpha 通道,然后将它们按比例缩小并与 Color.Black 混合,您可能会得到它。
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |