3

私の悪い英語でごめんなさい。

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 を使用するなど、他のテクニックは非常に遅いです。

ご協力ありがとうございました。

4

0 に答える 0