tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル矩形領域の移動
記事No3562
投稿日: 2006/04/29(Sat) 06:48
投稿者うらしまん
[OSのVer]:Windows XP   [VBのVer]:VB.NET   2005

すいません。初心者です。

フォーム上でなんらかの画像を持った四角の領域を動かしたいのですが、
1回に付き、1dotだけ動かす制限で、出来るだけはやく動かしたいと考えています。
これまで3通りを試しましたがいずれも遅くて困っています

@四角の領域をPictureBoxで表示してPictureBoxをTimerコントロールイベントで動かす。

PictureBox1.Left = PictureBox1.Left + 1
をただひたすら繰り返す。

ACopyFromScreenを使ってTimerコントロールイベントでコピーする。


        g.CopyFromScreen(New Point(x1, y1), New Point _
             (x2, y2), New Size(w, h))

B一旦、クリップボードに保存して、Timerコントロールイベントで塗りつぶす。

    Using G2 As Graphics = Graphics.FromImage(Bmp)
        g.CopyFromScreen(New Point(x1, y1), New Point _
             (x2, y2), New Size(w, h))
        Clipboard.SetImage(Bmp)
    end using

===================================================

    Dim bmp0 As Bitmap
    bmp0 = Clipboard.GetImage
    Dim myTextureBrush As New TextureBrush(bmp0)
    g.FillRectangle(myTextureBrush, x2, y2, w, h)


で、256×256ドットの領域を動かしたときにPentium4 2.6GHzのPCで
1秒あたりの移動は@51dot/s、A20dot/s、B24dot/sとなり、
画面のリフレッシュレートでフレーム1dotを超えられません。
(いずれもビルトしてから実行しています)

もっと早く動かす手段が有りましたら教えていただけませんでしょうか。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: 矩形領域の移動
記事No3564
投稿日: 2006/04/29(Sat) 14:51
投稿者花ちゃん
Timerコントロールイベントを使わなければいいのでは。
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
   Dim sTime0 As DateTime = Now
   For i As Integer = 0 To 200
      PictureBox1.Left = PictureBox1.Left + 1
   Next i
   Dim eTime0 As DateTime = Now
   MessageBox.Show(eTime0.Subtract(sTime0).TotalSeconds & " 秒かかりました。")
End Sub
0.20 秒(1000/秒) Pentium4  1.70GHz  640MB(RAM)

[ツリー表示へ]
タイトルRe^2: 矩形領域の移動
記事No3569
投稿日: 2006/04/30(Sun) 07:19
投稿者うらしまん
[OSのVer]:Windows    [VBのVer]:VB.NET  
>> 1秒あたりの移動は@51dot/s、A20dot/s、B24dot/sとなり、
>> 画面のリフレッシュレートでフレーム1dotを超えられません。

> Timerコントロールイベントを使わなければいいのでは。

おお。1800dot/sを超えました。
「動かす=timerイベント」と思い込んでいました。
目からウロコとはこのことです。
timerのIntervalを最小の1msにしていたのでtimerのイベント以外で高速化を検討しないといけないかと
思っていました。
ただ割り込める状態で移動速度の調整はしなければならないのでloopの中に入れる処理を検討したいと
思います。

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

[ツリー表示へ]