2

我一直在尝试使用以下命令让双缓冲功能在 VB.NET GDI+ 中用于太空入侵者游戏

Public Sub New()
      …
    Me.SetStyle(ControlStyles.DoubleBuffer, True)
End Sub

但是因为我使用的是附加到一个类的单独的绘图例程,所以它似乎不起作用:

Class alien
   …
   Public Sub draw(ByVal palette)
      Dim image As New Drawing.Bitmap("E:\alien.gif")
      palette.DrawImage(image, loc.X, loc.Y, width, height)
   End Sub
End class

我从主窗体上的计时器调用此例程:

Private Sub TmrAlien_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TmrAlien.Tick
    Dim palette As Drawing.Graphics = Me.CreateGraphics

    dave.draw(palette)
    Invalidate()
End sub

外星人绘制正确,但图像非常卡顿,双缓冲似乎不起作用。

有任何想法吗

4

1 回答 1

3

问题出在您的 Tick 事件处理程序中。使用 CreateGraphics() 返回的 Graphics 对象进行绘图永远不会被双缓冲。调用 Invalidate() 是导致闪烁的原因,它会强制表单重新绘制自身,这将覆盖您在 draw() 方法中绘制的内容。你会在很短的时间内看到外星人。

像这样修复它:

Public Sub New()
      …
    Me.DoubleBuffered = True
End Sub

Private Sub TmrAlien_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TmrAlien.Tick
    '' Change dave.Loc
    ''...
    Invalidate()
End sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    dave.draw(e.Graphics)
    MyBase.OnPaint(e)
End Sub
于 2011-12-13T13:16:03.947 回答