14

コンテンツ パイプラインを使用して を使用してテキストをレンダリングする代わりにGraphics.DrawString、(かなり静的な) テキストの束をオフスクリーン ビットマップにレンダリングし、それを 1Texture2D回に変換してから単に を呼び出すことに欠点はありますか? これは基本的に「1 枚の紙」に描かれたテキストのページですが、ユーザーはフォントのサイズを変更することもできるため、さまざまなサイズのスプライトフォントを含める必要があります。SpriteBatch.DrawSpriteFont

これは Windows 専用のアプリなので (移植する予定はありません)、単純な古い WinForms アプリのようにすべてのフォントにアクセスできます。また、スプライト フォントを使用するよりGraphics.DrawStringも (または を使用した場合でも) レンダリングの品質がはるかに優れていると思います。TextRenderer

また、各反復でテキスト全体を「レンダリング」する必要があるため(つまり、各文字の頂点を個別に送信する)、パフォーマンスが向上する可能性がありますがSpriteBatch.DrawString、ビットマップを使用することで一度だけ実行するため、 CPU側。

  1. ここに表示されていない問題や欠点はありますか?
  2. スプライトフォントを使用してアルファ ブレンド テキストを取得することは可能ですか? Nuclex フレームワークが言及されているのを見たことがありますが、Monogame AFAIK には移植されていません。

[アップデート]

技術的な面では、スプライト フォントよりもはるかに優れたテキスト レンダリングで、完全に機能しているようです。それらが水平にレンダリングされる場合、ClearType も取得します。存在する可能性のある問題の 1 つは、フォントのスプライトシートは、テキストのページ用に別のテクスチャを作成するよりも、テクスチャ メモリの点で効率的である (そうかもしれません?) ことです。

4

2 に答える 2

2

いいえ

マイナス面はないようです
。実際、テキスト レンダリングに対する標準的なアプローチに従っているようです。

テキストの「適切な」レンダリングは、SpriteFonts がすべてのスプライン グリフを切り取ったとしても、テクスチャ クワッドのレンダリングに比べて処理が比較的遅くなります。

私が GL/XNA 用のさまざまなテキスト レンダリング ソリューションを検討してきたときはいつでも、人々はあなたのアプローチを推奨する傾向があります。テキストの壁を一度再利用可能なテクスチャに描画してから、そのテクスチャをレンダリングします。

また、移植可能なソリューションとしてRenderTarget2Dを検討することもできます。
例として:

// Render the new text on the texture
LoadPageText(int pageNum) {
    string[] text = this.book[pageNum];
    GraphicsDevice.SetRenderTarget(pageTarget);
    // TODO: draw page background

    this.spriteBatchCache.Begin();
    for (int i = 0; i < text.Length; i++) {
         this.spriteBatchCache.DrawText(this.font, 
             new Vector2(10, 10 + this.fontHeight * i), 
             text[i], 
             this.color);
    }
    this.spriteBatchCache.End();
    GraphicsDevice.SetRenderTarget(null);
}

次に、シーン レンダリングで、テキストをレンダリングできspriteBatch.Draw(..., pageTarget, ...)ます。この方法では、すべてのページに必要なテクスチャは 1 つだけです。フォントが変更された場合は再描画することも忘れないでください。

他に考慮すべき点は、SpriteBatches の並べ替えモードです。これは、多くの三角形をレンダリングするときにパフォーマンスに影響を与えることがあります。

ポイント 2 では、前述したように、SpriteFonts は事前にレンダリングされたテクスチャです。これは、透明度がスプライトシートに焼き付けられることを意味します。そのため、デフォルトのライブラリは透明度/アンチエイリアスを使用していないようです。

それらを 2 倍の大きさでレンダリングし、黒地に白を使用し、SourceColor をアルファ チャネルとして使用してから、Color.Black とブレンドして縮小してレンダリングした場合、元に戻すことができます。

于 2017-11-24T08:25:19.560 に答える