你的问题有点不清楚。据我了解,您需要易于缩放的字体。
我认为这是不可接受的
据我所知,这是字体的标准行为——即使是系统字体也是如此。它们不应该很容易扩展。
可能的解决方案:
- 使用 ID3DXRenderTarget 将文本渲染到纹理上。当您将其放大太多时,字体将被过滤。有些人会认为它看起来很丑。
- 编写支持矢量字体的自定义库。即 - 它应该能够从字体中提取字体轮廓,并从中构建文本。它会比 ID3DXFont 慢得多(它已经比传统的“纹理”字体慢)。文本将很容易扩展。使用这种方式,您很可能会看到小文本的可见伪影(“噪音”)。除非您想要大字母(40+ 像素),否则我不会使用这种方法。Freetype 库可能具有处理字体轮廓的功能。
- 或者您可以尝试使用 D3DXCreateText。这将为一个字符串创建 3D 文本。根本不会快。
我会忘记的。只要用户对整体性能感到满意,改进字体渲染例程(因此它们的行为对您来说看起来不错)是不值得的。
- 编辑 -
关于 ID3DXRenderTarget。
即使你使用 ID3DXRenderTarget,你也需要 ID3DXFont。即,您使用 ID3DXFont 将文本渲染到纹理上,然后使用纹理将文本粘贴到屏幕上。
因为您说性能至关重要,您可以延迟创建新 ID3DXFont 直到用户停止调整视频大小。即当用户开始调整视频大小时,您使用旧字体,但使用纹理对其进行升级。当然会有过滤。一旦用户停止调整大小,您将在有时间时创建新字体。您可能可以在单独的线程中执行此操作,但我不确定。或者,您可以简单地始终以与视频相同的分辨率呈现文本。这样您就不必担心调整它的大小(它仍然会与视频一起被过滤)。一些视频播放器以这种方式工作。
关于 ID3DXFont 的更多信息。ID3DXFont 有一个问题——在需要大量文本的情况下它很慢(但你仍然需要它,因为它支持 unicode,并且用 unicode 支持编写 texturefont 很痛苦)。上次我使用它时,我通过在纹理中缓存常用字符串来优化事物。即在行中绘制超过 3 帧的任何字符串都被渲染到 D3DFMT_A8R8G8B8 纹理/渲染目标上,然后我一直从纹理复制该字符串而不是使用 ID3DXFont。一段时间未渲染的字符串已从纹理中移除。这给了一些严重的推动。然而,这个解决方案很棘手 - 监控纹理中的空白空间,删除未使用的字符串,并对纹理进行碎片整理并不是很简单(没有什么特别复杂的,但很容易出错)。除非您的屏幕完全被文本覆盖,否则您将不需要如此复杂的系统。