0

Direct3D9 で大量のテキスト (数行、おそらく数十行) を描画する必要があるアプリケーションを作成しています。テキストは厳密にフォーマットすることができ (つまり、さまざまな書体、スタイル、サイズ)、さまざまな文字セットの Unicode シンボルを含めることができます。最悪なのは、オンザフライで変更される可能性があるため、動的である必要があることです (レンダリング ワンス ディスプレイでは常にうまくいきません)。

これには 2 つの問題があります。1 つ目は、D3DXCreateFont への多くの呼び出しが必要になる可能性があることです。これにはコストがかかると思われます (よくわかりません)。もう 1 つのアプローチは、マルチパート ラインを描画する前にすべてのフォントを作成してから、それらを切り替えるだけです。これはより良い方法ですか? さて、線を描くときにオンザフライでフォント オブジェクトを作成し、それらをある種のフォント オブジェクト キャッシュに追加してから、新しいオブジェクトを作成する前にキャッシュを調べることもできますか? 最善のアプローチはどれだと思いますか?

2 つ目の問題は、D3DXFont が下線/取り消し線のフォント スタイルを認識していないように見えることです。D3DFONT は LOGFONT に基づいていますが、それらのフィールドは省略されています (斜体はサポートされています)。下線/取り消し線が本当に必要だとしましょう。どうすればよいですか? ID3DXFont に下線を強制する方法はありますか? 自分でそれらの線を引く必要がありますか (どうすれば速くできますか)? または、HDC で GDI を使用して描画し、それらのピクセルをテクスチャにコピーするように切り替える必要があります。これにより、適切なパフォーマンスが得られますか?

4

1 に答える 1

0

ええと、線を引いてその場でフォントオブジェクトを作成し、それらをある種のfont-object-cacheに追加してから、新しいオブジェクトを作成する前にキャッシュを調べることもできますか?最善のアプローチは何だと思いますか?

キャッシングアプローチ。キャッシュを使用せずに、必要なときにいつでもフォントをオンザフライで再作成しようとしないでください。D3DXCreateFontの実際のコストはわかりませんが、関数は設計上、頻繁に呼び出されることを意図したものではありません。

アンダースコア/ストライクアウトに関して-withとパススルーシェーダーを使用IDirect3DDevice9::DrawPrimitiveUPしてラインを自分で上にレンダリングし、ラインの頂点を変更せず、変換しないようにすることができます。D3DPT_LINELIST

または、HDCでGDIを使用して描画するように切り替えてから、それらのピクセルをテクスチャにコピーする必要があります。これにより、妥当なパフォーマンスが得られますか?

テクスチャの内容をシステムRAMからVRAMに転送する必要があるため、私はしません。

于 2010-02-07T13:20:34.223 に答える