6

あるコントロールにグラフィックを表示する必要があるとしましょう。しかし、ある条件に基づいて切り替えられる 3 つの画像があります。リソース ファイルに 3 つのビットマップが追加されます。

そのため、ResourceManager.GetObject を呼び出してそれらを取得します。

問題は、次のようにする必要があるということです。

  1. 画像を切り替える必要があるたびに、GetObject を呼び出して画像を取得し、コントロールに割り当てたり、
  2. 最初に各画像の GetObject の結果を保持して、GetObject への呼び出しが 3 回だけになるようにします。代わりに、変数から画像を割り当てます。

1) を行うと、CLR Profiler で表示すると、多くの GC ハンドルが生成されるようです。2)の悪い副作用を知りたい。

どうもありがとう。

4

5 に答える 5

8

を呼び出すたびにGetObject、アセンブリからイメージが読み取られ、オブジェクトに読み込まれBitmapます。

何度も呼び出すと、かなりのオーバーヘッドが発生します。画像を保存する必要があります。

于 2010-10-29T02:28:26.920 に答える
2

また、 「一度読み取ってから変数に格納する」という概念をクラスに実装しました。

例を示すために、ここに私のコードからの抜粋があります:

internal static class MyResourcesHolder
{
    private static Image _i1;
    private static Image _i2;
    private static Image _i3;
    private static Image _i4;
    private static Image _i5;

    public static Image MyImage01 => _i1 ?? (_i1 = Resources.MyImage01);
    public static Image MyImage02 => _i2 ?? (_i2 = Resources.MyImage02);
    public static Image MyImage03 => _i3 ?? (_i3 = Resources.MyImage03);
    public static Image MyImage04 => _i4 ?? (_i4 = Resources.MyImage04);
    public static Image MyImage05 => _i5 ?? (_i5 = Resources.MyImage05);
}

多分これはいつか誰かを助けるでしょう。

于 2015-11-18T12:17:39.723 に答える
1

MSDNのドキュメントには、リソースの値は ResourceManager.GetObject によって返されると記載されています。個々のビットマップは実行時に変更されないように思われるため、#2 にアプローチする唯一の欠点は、メモリ フットプリントが少し大きくなることです。

于 2010-10-29T02:32:33.950 に答える