【问题标题】:How to stop flickering when redrawing ellipses in windows forms在Windows窗体中重绘椭圆时如何停止闪烁
【发布时间】:2019-09-02 22:07:07
【问题描述】:

我试图让一个球在屏幕上弹跳,除了每次移动时令人讨厌的闪烁之外,这主要是工作。

我已经搜索了一段时间,大多数网站都告诉你启用双缓冲,这有点帮助,但它仍然严重闪烁。

有人对如何解决这个问题有任何建议吗?

谢谢:)

我的代码:

Imports System.Drawing
Public Class Form1

    Public gr As Graphics
    Public XSpeed As Integer = 2
    Public YSpeed As Integer = 2
    Public ParticleCoord(1) As Integer
    Public Blackbrush As New SolidBrush(Color.Black)



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gr = Me.CreateGraphics()

        YSpeed = CInt(Math.Ceiling(Rnd() * 10))
        XSpeed = CInt(Math.Ceiling(Rnd() * 10))

        ParticleCoord = {50, 50}

        Timer.Enabled = True

    End Sub

    Private Sub ParticleMove(ByRef XSpeed, ByRef YSpeed)
        If (ParticleCoord(0) < (12 + 1189) And ParticleCoord(0) > 12) And (ParticleCoord(1) < (12 + 449) And ParticleCoord(1) > 12) Then
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
            gr.Clear(Color.White)
            gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
        ElseIf (ParticleCoord(0) < (12 + 1189) And ParticleCoord(0) > 12) Then
            YSpeed = -YSpeed
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
            gr.Clear(Color.White)
            gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
        ElseIf (ParticleCoord(1) < (12 + 449) And ParticleCoord(1) > 12) Then
            XSpeed = -XSpeed
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
            gr.Clear(Color.White)
            gr.FillEllipse(Blackbrush, (ParticleCoord(0) + XSpeed), (ParticleCoord(1) + YSpeed), 50, 50)
        Else
            YSpeed = -YSpeed
            XSpeed = -XSpeed
            ParticleCoord = {ParticleCoord(0) + XSpeed, ParticleCoord(1) + YSpeed}
        End If
    End Sub

    Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick
        ParticleMove(XSpeed, YSpeed)
    End Sub


End Class

【问题讨论】:

  • 永远不要使用 CreateGraphics。使用正在绘制的容器的 Paint 事件中的 Graphics。这里有很多例子可供研究。
  • 对不起,我不知道 stackoverflow 是否搞砸了,但我没有看到您关于仅获得 15 毫秒的消息 :)
  • 永远不要使用 CreateGraphics。使用正在绘制的容器的 Paint 事件中的 Graphics。这里有很多例子可供研究。
  • 你的球闪烁,因为你先是gr.Clear(Color.White),然后是gr.FillEllipse(blackBrush, ...。在这些调用之间,表格被绘制并且没有球。这与定时器频率无关。
  • 互联网很好。当我一直告诉你它是 CreateGraphics 时,你似乎卡在计时器上了。 CreateGraphics 是一种作弊,因为它会在屏幕上临时绘制。它会忽略您的缓冲。

标签: vb.net winforms graphics paint flicker


【解决方案1】:

如 cmets 中所述,您应始终使用来自 Paint-event 的 Graphics 对象。要调用重绘,请在您的控件上调用 Invalidate()。不要不要使用Refresh()(没那么糟糕)或Application.DoEvents()(非常糟糕)来执行重绘。

奖励:获得非常流畅的绘图体验的专业提示

摆脱OnPaintBackground(),见my other answer here

有了它,您将获得良好的渲染性能(对于 GDI+),我经常使用它。您可以在我为分析 WinForms 控件层次结构而制作的一个有趣项目中通过 here 看到它:WinFormsCT on GitHub

【讨论】:

  • 谢谢,现在可以完美运行,没有闪烁和最小延迟,即使一次在屏幕上显示 100 个 :)
  • 听起来不错。 WinForms 和 GDI+ 并没有许多开发人员声称的那么糟糕。
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 2013-05-07
  • 2013-07-31
  • 2011-11-22
  • 1970-01-01
  • 2012-02-04
  • 2023-01-02
  • 2010-11-22
相关资源
最近更新 更多