BufferedGraphics - Schnell zeichnen ohne Flimmern

    • VB.NET

      BufferedGraphics - Schnell zeichnen ohne Flimmern

      Hi
      Die Frage, wie man ohne Flimmern zeichnet, wurde inzwischen schon vielfach gestellt. Jetzt habe ich mich entschlossen, einen Code zu veröffentlichen, der das Problem behebt. Die nachfolgende Klasse soll nur veranschaulichen, wie die Buffered-Graphics-Klasse funktioniert und ist nicht optimal gecodet, zeigt aber auf, wie der Fehler zu Behandeln ist.

      VB.NET-Quellcode

      1. Public NotInheritable Class Rendering
      2. Private bgcContext As BufferedGraphicsContext 'Erzeugt den buffer
      3. Private clrBackColor As Color = Color.Black 'Hintergrundfarbe
      4. Public Property BackColor() As Color
      5. Get
      6. Return clrBackColor
      7. End Get
      8. Set(ByVal value As Color)
      9. clrBackColor = value
      10. End Set
      11. End Property
      12. Public Sub Render(ByVal surface As Graphics)
      13. 'erzeugt das BufferedGraphics-Objekt für ein Graphics-Objekt
      14. Dim bg As BufferedGraphics = bgcContext.Allocate(surface, Rectangle.Round(surface.ClipBounds))
      15. Draw(bg)
      16. bg.Render()
      17. bg.Dispose()
      18. End Sub
      19. Public Sub Render(ByVal surface As Graphics, ByVal clipRectangle As Rectangle)
      20. 'erzeugt das BufferedGraphics-Objekt für ein Graphics-Objekt
      21. Dim bg As BufferedGraphics = bgcContext.Allocate(surface, Rectangle.Round(clipRectangle))
      22. Draw(bg)
      23. bg.Render()
      24. bg.Dispose()
      25. End Sub
      26. Public Sub Render(ByVal deviceContext As IDeviceContext, ByVal clipRectangle As Rectangle)
      27. 'erzeugt das BufferedGraphics-Objekt für ein DeviceContext-Objekt
      28. Dim bg As BufferedGraphics = bgcContext.Allocate(deviceContext.GetHdc, clipRectangle)
      29. Draw(bg)
      30. bg.Render()
      31. bg.Dispose()
      32. deviceContext.ReleaseHdc()
      33. End Sub
      34. Private Sub Draw(ByVal bufferedSurface As BufferedGraphics)
      35. With bufferedSurface.Graphics
      36. 'zeichnen
      37. .Clear(clrBackColor)
      38. .FillEllipse(Brushes.Blue, 100, 100, 10, 10)
      39. End With
      40. End Sub
      41. Public Sub New()
      42. bgcContext = BufferedGraphicsManager.Current
      43. End Sub
      44. Public Sub New(ByVal context As BufferedGraphicsContext)
      45. bgcContext = context
      46. End Sub
      47. End Class


      Zum Zeichnen einfach eine Instanz der Klasse erstellen und die Render-Methode aufrufen.

      Eine Veranschaulichung befindet sich im Anhang.
      Die BallsNormal.exe-Datei zeigt das Problem von GDI+, die BallsBuffered.exe-Datei ist mithilfe der BufferedGraphics-Klasse optimiert worden.


      Gruß
      ~blaze~
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ () aus folgendem Grund: Rechtschreibung ausgebessert; Negative Formulierung ausgebessert; Release()-Aufruf bei der Render(IDeviceContext, Rectangle)-Prozedur