Timer arbeiten langsamer, warum?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von vandi13.

    Timer arbeiten langsamer, warum?

    Hallo Leute, ich komme mit einem Problem nicht weiter.

    Kurze Erklärung des noch relativ "einfachen" Programms:

    Es gibt einen Button, und mit jedem Klick auf den Button wird ein neues Objekt einer selbst erstellten Klasse "gegner" generiert. Das sind einfach Kreise mit einer Progressbar und die laufen mit konstanter Geschwindigkeit durch meine Form. Doch desto mehr Gegner ich hinzufüge, desto langsamer werden auch alle anderen. Ab ca. 30-40 Buttonklicks bewegt sich kaum noch etwas. Woran kann das liegen?

    So sieht die Implementierung aus:

    Die Form1:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.PowerPacks
    2. Public Class Form1
    3. Dim lol As gegner
    4. Dim gegnercount As Integer = 1
    5. Dim canvas As ShapeContainer
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. canvas = New ShapeContainer
    8. canvas.Name = "OverallCanvas"
    9. canvas.Parent = Me
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. spawnNewEnemy()
    13. End Sub
    14. Private Sub spawnNewEnemy()
    15. lol = New gegner
    16. lol.zeichne(Me, Level.startpoint, enemycount, canvas)
    17. lol.startMoving()
    18. enemycount = enemycount + 1
    19. End Sub


    Level.startpoint ist dabei eine Location aus der Klasse "Level", die ich hier nicht aufführe da sie relativ simpel ist und nur Variablen beinhaltet.

    So jetzt zur gegner Klasse

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.PowerPacks
    2. Public Class gegner
    3. Dim life As Integer = 100
    4. Dim speed As Integer = 20 ' Enemy speed
    5. Dim moveTimer As Timer
    6. Dim theShape As RectangleShape
    7. Dim lifebar As ProgressBar
    8. Dim startX As Integer
    9. Dim form As Form
    10. Dim startY As Integer
    11. Dim canvas As ShapeContainer
    12. Public Sub zeichne(ByVal pForm As Form, ByVal pSpawn As Point, ByVal pID As Integer, ByVal pCanvas As ShapeContainer)
    13. theShape = New RectangleShape
    14. form = pForm
    15. theShape.Parent = pCanvas
    16. theShape.Name = "enemy" & pID
    17. theShape.Size = New System.Drawing.Size(5, 5)
    18. theShape.Location = pSpawn
    19. theShape.CornerRadius = 12
    20. startX = pSpawn.X
    21. startY = pSpawn.Y
    22. lifebar = New ProgressBar
    23. lifebar.Parent = form
    24. lifebar.Size = New System.Drawing.Size(10, 5)
    25. lifebar.Name = "lifebarenemy" & pID
    26. lifebar.Location = New System.Drawing.Point(theShape.Location.X - 2.5, theShape.Location.Y - 5)
    27. lifebar.Value = life
    28. canvas = pCanvas
    29. End Sub
    30. Public Sub startMoving()
    31. moveTimer = New Timer()
    32. moveTimer.Interval = 10
    33. moveTimer.Start()
    34. AddHandler moveTimer.Tick, AddressOf moverek
    35. End Sub
    36. Public Sub moverek()
    37. If theShape.Location.X < 750 And theShape.Location.Y = startY Then
    38. move(theShape.Location.X + speed / 20, theShape.Location.Y)
    39. ElseIf theShape.Location.X > 749 And theShape.Location.Y > 400
    40. move(theShape.Location.X, theShape.Location.Y - speed / 20)
    41. ElseIf theShape.Location.X > 50 And theShape.Location.Y = 400
    42. move(theShape.Location.X - speed / 20, theShape.Location.Y)
    43. ElseIf theShape.Location.X < 51 And theShape.Location.Y > 200
    44. move(theShape.Location.X, theShape.Location.Y - speed / 20)
    45. ElseIf theShape.Location.X < 750 And theShape.Location.Y = 200
    46. move(theShape.Location.X + speed / 20, theShape.Location.Y)
    47. End If
    48. End Sub
    49. Public Sub move(ByVal pX As Integer, ByVal pY As Integer)
    50. theShape.Location = New System.Drawing.Point(pX, pY)
    51. lifebar.Location = New System.Drawing.Point(theShape.Location.X - 2.5, theShape.Location.Y - 5)
    52. End Sub
    53. End Class


    Sorry falls der Code noch nicht professionell ist, bin Anfänger und nur am rumprobieren.

    Aber dieses Problem kriege ich einfach nicht weg... Danke schonmal für eure Aufmerksamkeit!
    :saint:
    Die Kreise bewegen sich einfach langsamer mit jedem neuen der dazu kommt. Ist nur ein Gegner vorhanden, bewegt er sich mit 10 Pixeln pro Sekunde nach rechts. Sobald aber mehrere drin sind, bewegt sich kaum einer um auch nur ein paar Pixel.

    Da die Objekte sich ja "in" dem Timer bewegen, dachte ich es muss irgendwie am Timer liegen dass es langsamer läuft. Daher der Betreff
    :saint:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vandi13“ ()

    vandi13 schrieb:

    mit jedem neuen der dazu kommt.
    Vielleicht solltest Du den Algorithmus optimieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay ich verstehe was du meinst. Aber weiß nicht wie ich es umsetzen soll. Es sind doch eigentlich mehrere Timer die PARALLEL zueinander laufen. Warum schränken die sich gegenseitig ein?

    Wenn ich die Bewegung jedes Kreises in den selben Timer stecken würde wäre es klar dass es langsamer wird, aber bei parallelen Methoden?

    Prozessorlast permanent unter 4%.
    :saint:

    vandi13 schrieb:

    Es sind doch eigentlich mehrere Timer die PARALLEL zueinander laufen.
    Von wievielen Timern reden wir?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Rainman schrieb:

    genau einen Timer
    Ja, das ginge in die richtige Richtung.
    @vandi13 Z.B. könntest Du vom zentralen Timer Ticks an jedes Objekt senden und dort in einer Task tun, was zu tun ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hat auch nicht geholfen. Wurde trotzdem ausgebremst.Habe jetzt einfach die Timer weggeschmissen und alles mit Threads augestattet. Jetzt klappt es wunderbar.
    :saint:

    ThuCommix schrieb:

    Ich nehme an du baust ein Spiel? Für was genau brauchst du mehrere Threads?


    Richtig. Aber da die Frage jetzt nicht direkt mit Spieleprogrammierung zusammen stand, hab ich sie hier gepostet.
    :saint: