不使用SpriteFont在MonoGame中绘制文本的最佳方法是什么?

时间:2017-07-06 12:30:15

标签: c# performance text fonts monogame

好吧,所以我正在制作MonoGame游戏,该游戏设置在计算机操作系统中。正如预期的那样,它会进行大量的文本渲染。游戏中的操作系统允许用户自定义操作系统的几乎每个方面 - 人们已经为操作系统制作了皮肤,使其看起来像Mac OS Sierra,几乎每个自95年以来的每个Windows主流版本,Xubuntu,Ubuntu以及更多。< / p>

这个游戏过去是用Windows Forms编写的,但是我想要实现的功能在WinForms中是不可能实现的。所以,我们决定从WinForms迁移到MonoGame,我们面临着一个巨大的问题。

我们制作的皮肤格式允许用户选择安装在其计算机上的任何字体,用于标题栏文本,主UI文本,终端文本等各种元素。这在WinForms中很好,因为我们可以使用{ {1}}呈现文本并允许在系统上使用任何TrueType字体。如果它可以加载到System.Drawing,则可以渲染。

但是,MonoGame使用不同的技术在屏幕上呈现文本。 System.Drawing.Font个对象。问题是,似乎没有办法从代码中用于生成SpriteFont(系列,大小,样式等)的相同数据动态生成SpriteFont

所以,因为我似乎无法动态创建SpriteFonts,在我的图形助手类(处理绘制纹理等到当前图形设备上而不需要在任何地方都需要复制粘贴代码),我有自己的DrawString和MeasureString使用System.Drawing.Graphics将文本合成到位图上并使用该位图作为纹理绘制到屏幕上的方法。

而且,这就是我的代码。

System.Drawing.Font

我已经缓存了大量动态创建的纹理 - 用于游戏内程序,皮肤纹理等的窗口缓冲区,因此如果有的话,那些不会很难达到性能,但是这个文本渲染代码会命中很难。我甚至无法让游戏超过29 FPS!

那么,有没有一种更好的方法可以在没有SpriteFonts的情况下进行文本渲染,如果没有,有没有办法在代码中动态创建一个spritefont,只需指定一个字体系列,字体大小和样式(粗体,斜体,罢工等)?

我现在说我现在是MonoGame的中间人,但我有足够的时间让RenderTargets工作 - 所以如果你想回答这个问题,请回答它,好像你在和一个幼儿园的学生说话一样

任何帮助将不胜感激,因为这是一个主要的热门丁#&在我的游戏开发团队中你可能会发现自己在游戏中被提及作为主要帮助:P

1 个答案:

答案 0 :(得分:0)

您可以使用System.Drawing创建自定义spritefont并使用此选项。它基本上是每个可以使用的角色,存储在具有相应Texture2D的词典中。

当你想要绘制文本时,你只需绘制彼此相邻的每个字符。

这仍然很慢(因为没有矢量图形的绘图文本总是很慢),但至少你不必每帧都解析所有内容。

只需在某处指定可以使用的字符并导入它们。在编写索引时,字典在C#中的速度非常快,所以这应该不是问题。

希望这会有所帮助。祝你好运。