お世話になっております。私の周りにVB.netを使える人はあまりおらず、ネット検索やこのサイトに助けてもらいながらやっているものです。どうしても、一人では詰んでしまうので、助言やヒントだけでも頂けたらと思っています。
すでに一応完成しているアプリの動作で一度に多数の画像描画を行うイベントがあります。
以下のソースコードのようにして、New句でpictureboxのインスタンスを複数個作っています。
しかし、この動作が少々重く、5秒くらいかかっています。
(レイアウトオブジェクトを生成するコードについては割愛します。)
vb.net
1Public Class tanakakudai 2Private bihin(,) As System.Windows.Forms.PictureBox 3 4Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 5 Me.bihin = New System.Windows.Forms.PictureBox(10, 10) {} 6 Dim img As Image 7 Dim fs As FileStream 8 Dim adress(10, 10) As String 9 'Stopwatchオブジェクトを作成する 10 Dim sw As New System.Diagnostics.Stopwatch() 11 'ストップウォッチを開始する 12 sw.Start() 13 for i = 0 to 10 14 for i = 0 to 10 15 'DBからファイルパスを取得する。 16 adress(i, j) = command.ExecuteScalar() 17 Next 18 Next 19 20 'ストップウォッチを止める 21 sw.Stop() 22 '結果を表示する 23 Console.WriteLine("DBからの読み取り時間は") 24 Console.WriteLine(sw.Elapsed) 25 'ストップウォッチをリセットしてから再開する 26 sw.Reset() 27 sw.Start() 28 29 for i = 0 to 10 30 for i = 0 to 10 31 '取得したファイルパスから描画を行う。 32 Me.bihin(i, j) = New System.Windows.Forms.PictureBox() 33 fs = File.OpenRead(sResult) 34 img = Image.FromStream(fs, False, False) 35 bihin(i, j).Image = img 36 Me.Controls.Add(bihin(i, j)) 37 Next 38 Next 39 'ストップウォッチを止める 40 sw.Stop() 41 '結果を表示する 42 Console.WriteLine("描画にかかる時間は") 43 Console.WriteLine(sw.Elapsed) 44End Class
違う質問で、ある方に、画像を読み込むのではなく、Bitmapクラスを読み込んでクラスメンバとして保持するクラスを用意しておけば、EXE起動時にすべての画像を読み込んでおけば画像の読み込みは一回で済み、ある程度速くなるのではないかとも紹介されています。
その方法をぜひやってみたいと思いますが、クラスメンバに保持するのはどのようにすればよいのでしょうか。
なんとなくイメージはできるのですが、実際に参考になるソースコードが分からず、、困っています。
参考にできるサイトの紹介とかだけでもいいので、宜しくお願い致します。
〇追記
前回の質問の時から、計測をするように回答してくださっていた方、ご忠告に従わず失礼しました。
YAmaGNZさんの回答への返信でも書きましたが、重い腰を上げて計測を行った結果を以下に報告します。
- その他レイアウトオブジェクトの生成など: 0.00257s
- DBから画像ファイルパスなどの読み出し:0.0129663s
- 画像ファイルパスからimageプロパティに変換してpictureboxに描画:0.0069787s
- loadイベント全体でかかった時間: 0.0217302s
以上の結果でした。
これは割と性能のいいノートPCで行っているため、処理が速いですが、実際にこのアプリ用に使っている
タブレット端末は中古品で性能も悪く、5秒くらいかかってしまっています。
やはり、Bitmapクラスを読み込んでクラスメンバとして保持するクラスを用意していおいて全ての画像を読み込んでおけば項番2,3の動作が速くなると思います。(DBからファイルパスを持ってきて、imageプロパティに変換するというのを全部EXE起動時にやっておいた方が速くなると思います。)
なので、もっと速くする余地はありそうなので、これらのプログラム修正を行っていきたいと思います。
回答2件
あなたの回答
tips
プレビュー