使用Graphics.DrawString将(相当静态的)文本呈现到屏幕外位图,将其转换为Texture2D一次,然后只调用SpriteBatch.Draw,而不是使用内容管道和使用SpriteFont呈现文本,有什么坏处吗?这基本上是一页文字,画成一张“纸”,但用户也可以选择调整字体的大小,所以这意味着我必须包括不同大小的喷粉。
因为这是一个只使用Windows的应用程序(不打算移植它),所以我可以访问所有字体,就像一个普通的老WinForms应用程序一样,我相信使用Graphics.DrawString (甚至TextRenderer)的渲染质量会比使用雪碧字体要好得多。
而且,性能似乎会更好,因为SpriteBatch.DrawString需要在每次迭代中“呈现”整个文本(即分别发送每个字母的顶点),而通过使用位图,我只做了一次,所以在CPU端应该稍微少一点工作。
更新
从技术方面看,它似乎工作得很完美,比通过雪碧字体渲染文本要好得多。如果它们是水平呈现的,我甚至会得到ClearType。可能存在的一个问题是字体的spritesheets是(可能的吗?)在纹理内存方面,比为一页文本创建单独的纹理更有效。
发布于 2017-11-24 08:25:19
不是
,似乎没有什么不好的
实际上,您似乎遵循了一种标准的文本呈现方法。
与渲染纹理四角体相比,渲染文本“适当”是一个相对较慢的过程,即使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);
}然后在场景渲染中,你可以用spriteBatch.Draw(..., pageTarget, ...)渲染文本。这样,你只需要一个纹理为您的所有网页,只要记住,也重新绘制,如果你的字体改变。
需要考虑的其他事情是SpriteBatches排序模式,有时这可能会影响呈现许多三角形时的性能。
在第2点,正如我前面提到的,SpriteFonts是预渲染的纹理,这意味着透明度被烤到了它们的spritesheet上。因此,默认库似乎不使用透明/反混叠。
如果您在黑色上渲染它们的两倍大和白色,并使用SourceColor作为一个alpha通道,然后使它们缩小,与Color.Black混合使用,您可以将其恢复。
发布于 2017-11-24 15:13:20
请尝试使用指针混合颜色:
MixedColor = ((Alpha1 * Channel1) + (Alpha2 * Channel2))/(Alpha1 + Alpha2)https://stackoverflow.com/questions/28136874
复制相似问题