0

我正在编写一个需要在 Direct3D9 中绘制大量文本的应用程序——几行,可能是几十行。文本可以被大量格式化(即不同的字体、样式、大小),并且可以包含来自不同字符集的 unicode 符号。最糟糕的是,它可以随时更改,所以它需要是动态的(渲染一次显示总是不行的)。

这样做有两个问题:首先,我可能需要对 D3DXCreateFont 进行大量调用,据说这些调用成本很高(我自己也不确定)。另一种方法是在绘制多部分线之前创建所有字体,然后在它们之间切换——这样更好吗?好吧,我也可以在画线时即时创建字体对象,将它们添加到某种字体对象缓存中,然后在尝试创建新对象之前查看缓存?您认为哪种方法最好?

第二个问题是 D3DXFont 似乎不理解下划线/删除线字体样式。尽管 D3DFONT 基于 LOGFONT,但它省略了这些字段(虽然支持斜体)。假设我真的需要下划线/删除线,我该怎么办?有没有办法强制 ID3DXFont 做下划线?我应该自己画那些线吗(我怎么做那么快)?或者也许我应该切换到在 HDC 上使用 GDI 绘图,然后将这些像素复制到纹理中——这会提供合理的性能吗?

4

1 回答 1

0

好吧,我也可以在画线时即时创建字体对象,将它们添加到某种字体对象缓存中,然后在尝试创建新对象之前查看缓存?您认为哪种方法最好?

缓存方法。甚至不要尝试在需要时即时重新创建字体,而无需缓存。我不知道D3DXCreateFont's 的实际成本,但该功能的设计并不打算过于频繁地调用。

关于下划线/删除线 - 您可以使用IDirect3DDevice9::DrawPrimitiveUPwithD3DPT_LINELIST和直通着色器在顶部自己渲染线条,以使线条顶点保持不变和未转换。

或者也许我应该切换到在 HDC 上使用 GDI 绘图,然后将这些像素复制到纹理中——这会提供合理的性能吗?

我不会,因为它需要将纹理内容从系统 RAM 传输到 VRAM。

于 2010-02-07T13:20:34.223 回答