C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: リソースデータとメモリ消費について


(過去ログ 131 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■77716 / inTopicNo.1)  リソースデータとメモリ消費について
  
□投稿者/ メモリ節約し隊 (1回)-(2015/11/18(Wed) 21:48:43)

分類:[C#] 

Windows7以降のOS C# .NetFramework4.0 クラスライブラリに関する質問です。

リソースに画像を定義してリソースをtype1のようにフィールド変数として定義していたのですが、
メモリ消費が大きく、改新しようと考えております。
最初に考えたのがtype2のようにメソッドにする方法なのですが、
こちらもメモリ消費がtype1とあまり変わりませんでした。
そこでtype3のようにcase文で定義することを考えました。
メモリ消費は前述のものに比べて大きく節約できそうなのですが、
冗長で2次元配列の代用にするとさらに間延びしてしまうので困っております。

このような場合に記述が簡潔でメモリを節約できる方法はあるのでしょうか。

        //type1
        //public static Bitmap[] tabledata = new Bitmap[]
        //{
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //    Properties.Resources.Chrysanthemum,
        //};


        public Form1()
        {
            InitializeComponent();

            GetData(1);
        }

        private Bitmap GetData(int nIndex)
        {

            //type2
            //Bitmap[] tabledata = new Bitmap[]
            //{
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //    Properties.Resources.Chrysanthemum,
            //};

            //type3
            switch (nIndex)
            {
                case 0: return Properties.Resources.Chrysanthemum;
                case 1: return Properties.Resources.Chrysanthemum;
                case 2: return Properties.Resources.Chrysanthemum;
                case 3: return Properties.Resources.Chrysanthemum;
                case 4: return Properties.Resources.Chrysanthemum;
                case 5: return Properties.Resources.Chrysanthemum;
                case 6: return Properties.Resources.Chrysanthemum;
                case 7: return Properties.Resources.Chrysanthemum;
                case 8: return Properties.Resources.Chrysanthemum;
                case 9: return Properties.Resources.Chrysanthemum;
                default: return Properties.Resources.Chrysanthemum;
            }
        }

引用返信 編集キー/
■77717 / inTopicNo.2)  Re[1]: リソースデータとメモリ消費について
□投稿者/ Azulean (541回)-(2015/11/18(Wed) 22:15:58)
2015/11/18(Wed) 22:16:09 編集(投稿者)
ラムダでなんとかするとか。

■No77716 (メモリ節約し隊 さん) に返信
>         //type1
>         //public static Bitmap[] tabledata = new Bitmap[]
>         //{
>         //    Properties.Resources.Chrysanthemum,
(略)
>         //    Properties.Resources.Chrysanthemum,
>         //};

public static Func<Bitmap>[] tabledata = new Func<Bitmap>[]
{
  () => Properties.Resources.Chrysanthemum,
// (略)
  () => Properties.Resources.Chrysanthemum,
};

Bitmap bmp = tabledata[0]();

引用返信 編集キー/
■77718 / inTopicNo.3)  Re[2]: リソースデータとメモリ消費について
□投稿者/ メモリ節約し隊 (2回)-(2015/11/18(Wed) 23:02:13)
わぁ、すごい。 Azuleanさん回答ありがとうございます。

ラムダ式ってこんな使い方もできるんですね。検索とかソートにしか使ったことないですが。
確かにFuncでメソッド化すれば直接画像を開かずに済みますもんね。

2次元配列もこんな感じで行けました。
public static Func<Bitmap>[,] tabledata = new Func<Bitmap>[5,2]
{
{() => Properties.Resources.Chrysanthemum,() => Properties.Resources.Chrysanthemum},
{() => Properties.Resources.Chrysanthemum,() => Properties.Resources.Chrysanthemum},
{() => Properties.Resources.Chrysanthemum,() => Properties.Resources.Chrysanthemum},
{() => Properties.Resources.Chrysanthemum,() => Properties.Resources.Chrysanthemum},
{() => Properties.Resources.Chrysanthemum,() => Properties.Resources.Chrysanthemum},
};

それにしてもメモリに展開せずにデータテーブルを定義するのは案外複雑なのですね。困ったものです。

解決済み
引用返信 編集キー/
■77719 / inTopicNo.4)  Re[3]: リソースデータとメモリ消費について
□投稿者/ メモリ節約し隊 (3回)-(2015/11/18(Wed) 23:28:11)
それにしてもtype1はともかくtype2はなぜうまくいかなかったのでしょうか。
privateメソッドの中の変数ですが、ローカル変数でも配列データはメソッド処理完了後も持続してしまうのでしょうか。

引用返信 編集キー/
■77722 / inTopicNo.5)  Re[4]: リソースデータとメモリ消費について
□投稿者/ 魔界の仮面弁士 (563回)-(2015/11/19(Thu) 03:10:28)
No77719 (メモリ節約し隊 さん) に返信
> それにしてもtype1はともかくtype2はなぜうまくいかなかったのでしょうか。
> privateメソッドの中の変数ですが、ローカル変数でも配列データはメソッド処理完了後も持続してしまうのでしょうか。

リソース内にあるのはバイナリデータに過ぎず、実際には
>> Properties.Resources.Chrysanthemum
が呼ばれるたびに、新たに Bitmap インスタンスが生成されるためかと。



var a = Properties.Resources.Chrysanthemum;
var b = Properties.Resources.Chrysanthemum;
Console.WriteLine(ReferenceEquals(a, b)); // False

Bitmap[] ary1 = {
Properties.Resources.Chrysanthemum,
Properties.Resources.Chrysanthemum,
};
Console.WriteLine(ReferenceEquals(ary1[0], ary1[1])); // False

Bitmap[] ary2 = {a, a};
Console.WriteLine(ReferenceEquals(ary2[0], ary2[1])); // True

Bitmap[] ary3 = Enumerable.Repeat(Properties.Resources.Chrysanthemum, 2).ToArray();
Console.WriteLine(ReferenceEquals(ary3[0], ary3[1])); // True
引用返信 編集キー/
■77723 / inTopicNo.6)  Re[5]: リソースデータとメモリ消費について
□投稿者/ メモリ節約し隊 (4回)-(2015/11/19(Thu) 06:08:49)
なるほど、それでインスタンスが保持されてしまってメモリ消費が増えてしまうのですね。
魔界の仮面弁士さん回答ありがとうございます。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -