私の悪い英語でごめんなさい。
DrawingVisual をビットマップにレンダリングして、DiffuseMaterial を作成したいと考えています。私はこれをします:
public DiffuseMaterial GetDiffuseMaterial(string text, string font, double fontSize, Brush brush)
{
FormattedText formattedText = new FormattedText(text, CultureInfo.InvariantCulture, FlowDirection.LeftToRight, new Typeface(font), fontSize, brush);
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
drawingContext.DrawText(formattedText, new Point(0, 0));
RenderTargetBitmap bmp = new RenderTargetBitmap((int)(text.Length * fontSize), (int)fontSize, 96, 96, PixelFormats.Pbgra32);
bmp.Render(drawingVisual);
DiffuseMaterial mat = new DiffuseMaterial(new ImageBrush(bmp));
mat.Freeze();
return mat;
}
しかし...
- メソッド GetDiffuseMaterial を 10000 回使用すると、アプリケーションが停止します。すべてのアプリケーションは最大 10000 個の GDI ハンドルを持つことができ、RenderTargetBitmap は作成されるたびに 1 つの GDI ハンドルを使用するため、これは「正常」です。
これを回避するには、RenderTargetBitmap オブジェクトを解放します。しかし、私はそれをすることができませんでした。私はこれを試しました( mat.Freeze() と return mat; の間):
bmp.Freeze(); bmp = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
もう 1 つの方法は、RenderTargetBitmap を 1 つだけ用意し、それをパラメーターとして GetDiffuseMaterial に渡すことです。
しかし、GetDiffuseMaterial を 2 回呼び出すと、ハンドルが共有され、マテリアルが最後の変更を取得するため、2 つの同一のマテリアルが作成されます。(したがって、テキスト パラメータが同じでなくても!)
RenderTargetBitmap でやりたいことを行う別の方法がわかりません。
注意: GetDiffuseMaterial は 100 万回呼び出すことができます...
RenderTargetBitmap は、文字列テキストから DiffuseMaterial を作成するために私が見つけた最速の方法です。VisualBrush を TextBlock で使用する、DrawingBrush を使用するなど、他のテクニックは非常に遅いです。
ご協力ありがとうございました。