0

让我描述一下我的任务的“战场”:

  • 超过100万用户的多房间音视频聊天;
  • 自定义 Direct3D 渲染器;

我需要实现的是 TextOverVideo 功能。文本本身通过网络传输,并将使用 Direct3D 渲染器在接收方进行渲染。AFAIK,它通常用于游戏开发中,用字母/数字创建自己的纹理并绘制这些项目。因为我们的应用程序必须支持多种语言,所以我们应该使用一个标准。这就是为什么我一直在使用 ID3DXFont 界面,但我发现了一些不满意的限制。

我面临的是缺乏可扩展性。例如,如果用户正在调整视频窗口的大小,我必须在他这样做时使用新的 D3DXFONT_DESC 重新创建 D3DXFont。我认为这是不可接受的。这就是为什么我看到的唯一解决方案(由于我的技能)是以某种方式将文本渲染为纹理,因此通过缩放、平移等绘制精灵。

所以,我不确定我是否朝着正确的方向前进。请提供建议、经验、文献、资源...

4

2 回答 2

3

你的问题有点不清楚。据我了解,您需要易于缩放的字体。

我认为这是不可接受的

据我所知,这是字体的标准行为——即使是系统字体也​​是如此。它们不应该很容易扩展。

可能的解决方案:

  1. 使用 ID3DXRenderTarget 将文本渲染到纹理上。当您将其放大太多时,字体将被过滤。有些人会认为它看起来很丑。
  2. 编写支持矢量字体的自定义库。即 - 它应该能够从字体中提取字体轮廓,并从中构建文本。它会比 ID3DXFont 慢得多(它已经比传统的“纹理”字体慢)。文本将很容易扩展。使用这种方式,您很可能会看到小文本的可见伪影(“噪音”)。除非您想要大字母(40+ 像素),否则我不会使用这种方法。Freetype 库可能具有处理字体轮廓的功能。
  3. 或者您可以尝试使用 D3DXCreateText。这将为一个字符串创建 3D 文本。根本不会快。

我会忘记的。只要用户对整体性能感到满意,改进字体渲染例程(因此它们的行为对您来说看起来不错)是不值得的。

- 编辑 -

关于 ID3DXRenderTarget。
即使你使用 ID3DXRenderTarget,你也需要 ID3DXFont。即,您使用 ID3DXFont 将文本渲染到纹理上,然后使用纹理将文本粘贴到屏幕上。
因为您说性能至关重要,您可以延迟创建新 ID3DXFont 直到用户停止调整视频大小。即当用户开始调整视频大小时,您使用旧字体,但使用纹理对其进行升级。当然会有过滤。一旦用户停止调整大小,您将在有时间时创建新字体。您可能可以在单独的线程中执行此操作,但我不确定。或者,您可以简单地始终以与视频相同的分辨率呈现文本。这样您就不必担心调整它的大小(它仍然会与视频一起被过滤)。一些视频播放器以这种方式工作。
关于 ID3DXFont 的更多信息。ID3DXFont 有一个问题——在需要大量文本的情况下它很慢(但你仍然需要它,因为它支持 unicode,并且用 unicode 支持编写 texturefont 很痛苦)。上次我使用它时,我通过在纹理中缓存常用字符串来优化事物。即在行中绘制超过 3 帧的任何字符串都被渲染到 D3DFMT_A8R8G8B8 纹理/渲染目标上,然后我一直从纹理复制该字符串而不是使用 ID3DXFont。一段时间未渲染的字符串已从纹理中移除。这给了一些严重的推动。然而,这个解决方案很棘手 - 监控纹理中的空白空间,删除未使用的字符串,并对纹理进行碎片整理并不是很简单(没有什么特别复杂的,但很容易出错)。除非您的屏幕完全被文本覆盖,否则您将不需要如此复杂的系统。

于 2010-06-21T10:01:49.033 回答
0

ID3DXFont字体是扁平的,总是与屏幕平行。D3DXCreateText是可以缩放和旋转的网格。

纹理字体模糊,看起来不太清晰。不适合使用大量小文本的应用程序。

我正在编写一个可以创建 500 个文本网格的应用程序,每个网格平均有 3,000-5,000 个顶点。文本网格创建一次,然后是静态的。我在 GeForce 8800 上获得 700 fps。

于 2012-11-28T17:04:19.860 回答