0

私の仕事の「戦場」について説明しましょう。

  • 100万人以上のユーザーとのマルチルームオーディオ/ビデオチャット。
  • カスタムDirect3Dレンダラー;

実装する必要があるのはTextOverVideo機能です。テキスト自体はネットワークを経由し、Direct3Dレンダラーを使用して受信者側でレンダリングされます。AFAIK、これはゲーム開発で一般的に使用され、文字/数字を使用して独自のテクスチャを作成し、このアイテムを描画します。アプリケーションは多くの言語をサポートする必要があるため、標準を使用する必要があります。そのため、私はID3DXFontインターフェイスを使用してきましたが、満たされていない制限がいくつか見つかりました。

私が直面したのは、スケーラビリティの欠如です。たとえば、ユーザーがビデオウィンドウのサイズを変更している場合、その間に新しいD3DXFONT_DESCを使用してD3DXFontを再作成する必要があります。受け入れられないと思います。そのため、(私のスキルのために)私が目にする唯一の解決策は、テキストをテクスチャにレンダリングし、スケーリングや変換などでスプライトを描画することです。

ですから、正しい方向に進んでいるかどうかはわかりません。アドバイス、経験、文献、情報源を手伝ってください...

4

2 に答える 2

3

あなたの質問は少し不明確です。私が理解しているように、あなたは簡単にスケーラブルなフォントが必要です。

受け入れられないと思います

私の知る限り、これはフォントの標準的な動作です。システムフォントの場合でも同様です。それらは簡単にスケーラブルであるとは考えられていません。

可能な解決策:

  1. テキストをテクスチャにレンダリングするには、ID3DXRenderTargetを使用します。拡大しすぎると、フォントがフィルタリングされます。一部の人々はそれが醜いように見えると思うでしょう。
  2. ベクターフォントをサポートするカスタムライブラリを作成します。つまり、フォントからフォントのアウトラインを抽出し、そこからテキストを作成できる必要があります。ID3DXFont(従来の「テクスチャ」フォントよりもすでに遅い)よりもはるかに遅くなります。テキストは簡単にスケーラブルになります。この方法を使用すると、小さなテキストに対して目に見えるアーティファクト(「ノイズ」)が発生する可能性が非常に高くなります。巨大な文字(40ピクセル以上)が必要でない限り、このアプローチは使用しません。FreeTypeライブラリには、フォントのアウトラインを処理するための関数が含まれている場合があります。
  3. または、D3DXCreateTextを使用してみてください。これにより、1つの文字列の3Dテキストが作成されます。まったく速くはありません。

私はそれを忘れるでしょう。ユーザーが全体的なパフォーマンスに満足している限り、フォントレンダリングルーチンを改善することは(その動作があなたにとって見栄えがするように)努力する価値はありません。

- 編集 -

ID3DXRenderTargetについて。
EVen ID3DXRenderTargetを使用する場合は、ID3DXFontが必要です。つまり、ID3DXFontを使用してテキストをテクスチャにレンダリングし、次にテクスチャを使用してテキストを画面にブリットします。
パフォーマンスが重要であると言ったので、ユーザーがビデオのサイズ変更を停止するまで、新しいID3DXFontの作成を遅らせることができます。つまり、ユーザーがビデオのサイズ変更を開始するときは、古いフォントを使用しますが、テクスチャを使用してアップスケールします。もちろん、フィルタリングもあります。ユーザーがサイズ変更をやめたら、時間があるときに新しいフォントを作成します。おそらく別のスレッドでそれを行うことができますが、それについてはよくわかりません。または、常にビデオと同じ解像度でテキストをレンダリングすることもできます。このように、サイズ変更について心配する必要はありません(ビデオと一緒にフィルタリングされます)。一部のビデオプレーヤーはこのように機能します。
ID3DXFontについて他にいくつかあります。ID3DXFontには1つの問題があります。大量のテキストが必要な状況では遅くなります(ただし、Unicodeをサポートし、Unicodeをサポートするtexturefontを作成するのは面倒なので、それでも必要です)。前回それを使って作業したときは、よく使用される文字列をテクスチャにキャッシュすることで物事を最適化しました。つまり、行に3フレームを超えて描画された文字列は、D3DFMT_A8R8G8B8テクスチャ/レンダリングターゲットにレンダリングされ、ID3DXFontを使用する代わりに、テクスチャからその文字列をコピーしていました。しばらくレンダリングされなかった文字列は、テクスチャから削除されました。それはいくつかの深刻な後押しを与えました。ただし、このソリューションには注意が必要です。テクスチャ内の空きスペースを監視し、未使用の文字列を削除し、テクスチャを最適化することは簡単ではありません(非常に複雑なことはありません。しかし、間違いは簡単です)。画面が文字通りテキストで覆われていない限り、このような複雑なシステムは必要ありません。

于 2010-06-21T10:01:49.033 に答える
0

ID3DXFontフォントはフラットで、常に画面と平行です。D3DXCreateTextは、スケーリングおよび回転できるメッシュです。

テクスチャフォントはあいまいで、あまりはっきりと見えません。小さなテキストをたくさん使用するアプリには適していません。

500個のテキストメッシュを作成できるアプリを作成しています。各メッシュの平均頂点数は3,000〜5,000です。テキストメッシュは一度作成されると、静的になります。GeForce8800で700fpsを取得します。

于 2012-11-28T17:04:19.860 に答える