8

少し前に、WriteableBitmap メモリ リークに関連する質問を投稿しました。問題に関連する素晴らしいヒントを受け取りましたが、まだ深刻なバグがあると思います / (私のミス) / (混乱) / (その他のこと)ここ。

だから、ここに私の問題があります:

Image と Button を持つ WPF アプリケーションがあるとします。画像のソースは非常に大きなビットマップ (3600 * 4800 ピクセル) であり、実行時に表示されると、アプリケーションは最大 90 MB を消費します。

ここで、イメージのソース (非常に大きなイメージ) から WriteableBitmap をインスタンス化するとします。これが発生すると、アプリケーションは ~220 MB を消費します。

画像への変更(WriteableBitmapによる)が終了し、WriteableBitmapへのすべての参照(少なくとも私が知っているもの)が(メソッドの最後で、またはそれらを設定することによって)破棄されるとき、トリッキーな部分が来ますnull に) writeableBitmap によって使用されるメモリが解放され、アプリケーションの消費量が ~90 MB に戻るはずです。問題は、返される場合と返されない場合があることです。

サンプルコードは次のとおりです。

// The Image's source whas set previous to this event
private void buttonTest_Click(object sender, RoutedEventArgs e)
    {
        if (image.Source != null)
        {
            WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source);

            bitmap.Lock();

            bitmap.Unlock();

            //image.Source = null;
            bitmap = null;
        }
    }

ご覧のとおり、参照はローカルであり、メソッドの最後 (またはガベージ コレクターがそうすることにしたとき) にメモリを解放する必要があります。ただし、アプリは宇宙の終わりまで最大 224 MB を消費する可能性があります。

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

0

ビットマップ イメージを同じ解像度とピクセルでレンダリングする必要がありますか? はるかに低いピクセル セットで writeablebitmap を作成し、render メソッドを呼び出すことができます。writeablebitmap は render を呼び出すときに元の uielement への参照を保持するため、この場合、3 つのチャンクが作成されます: 1) 元の uielement、2) writeablebitmap 内のピクセル、3) コピーされたオリジナルへの参照。

メモリリークに関して writeablebitmap で同様の問題が発生し、次のリンクをチェックして修正しました: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s -big-image-problem-and-what-you-can-do-about-it.aspx

別の書き込み可能なビットマップを作成してピクセルをコピーすると、最初の書き込み可能なビットマップを破棄すると、メモリが解放されるはずです-少なくとも私のシナリオではそうしました。

于 2010-03-11T04:15:00.080 に答える