Programm "frisst" zu viel CPU

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Ferb300.

    Programm "frisst" zu viel CPU

    Hi community!
    Ich hab ein teil von einem Programm erstellt, das eine Welt für ein Jump and Run Game erstellt.
    Wenn auf den Button gedrückt wird, soll die Welt erstellt werden.
    So hab ich das gemacht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ziel_X_erreicht As Boolean = False
    3. Dim ziel_Y_erreicht As Boolean = False
    4. Dim Blocksize As New Size(16, 16)
    5. Dim BlockPositionY As Decimal = 200
    6. Dim BlockPositionX As Integer = 0
    7. Dim Art As Blocktype = Blocktype.Grass
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Do Until ziel_Y_erreicht = True
    12. If BlockPositionY < 1005 Then
    13. Do Until ziel_X_erreicht = True
    14. If BlockPositionX < 965 Then
    15. Dim Block As New PictureBox
    16. Block.Size = Blocksize
    17. Block.Location = New Point(BlockPositionX, BlockPositionY)
    18. Select Case Art
    19. Case Blocktype.Grass
    20. Block.BackgroundImage = My.Resources.grass_block_minecraft
    21. Case Blocktype.Dirt
    22. Block.BackgroundImage = My.Resources.Dirt_Block_Minecraft
    23. End Select
    24. '
    25. BlockPositionX = BlockPositionX + 16
    26. Me.Controls.Add(Block)
    27. Else
    28. ziel_X_erreicht = True
    29. End If
    30. Loop
    31. BlockPositionY -= 16
    32. ziel_X_erreicht = False
    33. Art = Blocktype.Dirt
    34. Else
    35. ziel_Y_erreicht = True
    36. End If
    37. Loop
    38. End Sub
    39. End Class


    sry für die ganzen freizeilen, das ist einfach so passiert

    Wenn man jetzt auf den Button drückt hängt das ganze Programm und ein Blick in den Task-Manager verrät, dass das Programm stolze 30% CPU auslastet! Was kann ich dagegen tun?
    umfassender HTML-Editor mit allem drum und dran: 40%
    Die Picturebox ist ein Control um ein einzelnes Bild darzustellen, nicht um dafür missbraucht zu werden eine Platform in nem Spiel darzustellen. Was du können willst/musst ist es GDI/+ zu beherrschen. Damit zeichnest du auf eine einziges Panel alles was du brauchst.

    @simpelSoft keine Alternativen zu nennen ist natürlich auch schön:
    Dev1: "Ist kacke, machs anders"
    Dev2: "okay, wie?"
    Dev1: "Machs anders."
    Ich habs auch ohne (das Tutorial zu) GDI+ geschafft, nämlich so:
    (keine Ahnung, warum es jetzt funktioniert)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ziel_X_erreicht As Boolean = False
    3. Dim ziel_Y_erreicht As Boolean = False
    4. Dim Blocksize As New Size(16, 16)
    5. Dim BlockPositionY As Decimal = 200
    6. Dim BlockPositionX As Integer = 0
    7. Enum Blocktype
    8. Dirt = 0
    9. Grass = 1
    10. End Enum
    11. Dim Art As Blocktype = Blocktype.Grass
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. SetWorldAgain()
    14. End Sub
    15. Sub SetWorldAgain()
    16. BlockPositionX = BlockPositionY = 0
    17. Do Until ziel_Y_erreicht = True
    18. If BlockPositionY < Me.Height Then
    19. Do Until ziel_X_erreicht = True
    20. If BlockPositionX < Me.Width Then
    21. Dim Block As New PictureBox
    22. Block.Size = Blocksize
    23. Block.Location = New Point(BlockPositionX, BlockPositionY)
    24. Select Case Art
    25. Case Blocktype.Grass
    26. Block.BackgroundImage = My.Resources.grass_block_minecraft
    27. Case Blocktype.Dirt
    28. Block.BackgroundImage = My.Resources.Dirt_Block_Minecraft
    29. End Select
    30. '
    31. BlockPositionX = BlockPositionX + 16
    32. Me.Controls.Add(Block)
    33. Else
    34. ziel_X_erreicht = True
    35. End If
    36. Loop
    37. BlockPositionY += 16
    38. BlockPositionX = 0
    39. ziel_X_erreicht = False
    40. Art = Blocktype.Dirt
    41. Else
    42. ziel_Y_erreicht = True
    43. End If
    44. Loop
    45. End Sub
    46.  
    47. End Class


    sry (mal wieder) für die ganzen freizeilen
    Kann mir einer sagen, warum es jetzt hinhaut?
    umfassender HTML-Editor mit allem drum und dran: 40%
    Ich vermute mal deswegen, vergleiche die beiden.

    Ferb300 schrieb:

    VB.NET-Quellcode

    1. Do Until ziel_Y_erreicht = True
    2. If BlockPositionY < 1005 Then
    3. BlockPositionY -= 16 ' ein -=
    4. Else
    5. ziel_Y_erreicht = True
    6. End If
    7. Loop

    Ferb300 schrieb:


    VB.NET-Quellcode

    1. Do Until ziel_Y_erreicht = True
    2. If BlockPositionY < Me.Height Then
    3. BlockPositionY += 16 ' ein +=
    4. Else
    5. ziel_Y_erreicht = True
    6. End If
    7. Loop

    Wenn du genau hinsiehst, müsstest du erkennen, dass im Startpost die Bedingung BlockPositionY < 1005 NIE eintreten kann, da du den Wert ständig verringerst.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „EaranMaleasi“ ()

    Danke, ich wusste zwar das es an diesen beiden zeilen liegt aber nicht, warum.
    Jetz weiß ich es! :thumbsup:
    umfassender HTML-Editor mit allem drum und dran: 40%
    Irrelevant. Auch wenn es jetzt so funktionieren mag.
    Guck dir Bitte Gdi+ an und das OOP konzept. Du kannst nämlich alles schön in Klassen sortieren für Tiles/Plattformen für deine Map, Player, Items, NPC.
    Und später kann man auch noch mit Vererbung arbeiten.
    Glaube mir es macht nicht nur den Code wesentlich übersichtlicher und besser wartbar, sondern Erlaubt dir auch viel größere Projekte relativ einfach zu meistern
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Guck dir Bitte Gdi+ an und das OOP konzept.


    Bei GDI+ check ich zwar überhauptnichts, aber das OOP-Konzept beherrsche ich im schlaf. Zum Beispiel werden jetzt nicht lauter pictureboxen erstellt sonder Objekte der klasse Block (selbstgeschrieben!), die von PictureBox erbt und Methoden und Funktionen hat, zum zerstören von blöcken, wiederhinbauen usw... Wenn das spiel fertig ist, tu ichs in den Showroom und poste hier einen link
    umfassender HTML-Editor mit allem drum und dran: 40%
    Nein du wirst nicht von PictureBox erben^^
    Kannst dir nen Interface Drawable mit ner Draw Methode machen und davon erben.
    In deiner Klasse Block speicherst du dann alle nötigen Informationen, die man zum zeichnen braucht. Implementierst die Draw Methode in welcher du auf das gegebene Graphics Objekt zeichnest.
    Dann kannst dir eine Map machen, die auch Drawable implementiert und alle Blöcke ebthält und deren draw Methoden in der eigenen aufruft.
    Aber auch da könnte man noch eine viel bessere Architektur machen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Ferb300 schrieb:

    jvbsl schrieb:

    Guck dir Bitte Gdi+ an und das OOP konzept.


    Bei GDI+ check ich zwar überhauptnichts, aber das OOP-Konzept beherrsche ich im schlaf. Zum Beispiel werden jetzt nicht lauter pictureboxen erstellt sonder Objekte der klasse Block (selbstgeschrieben!), die von PictureBox erbt und Methoden und Funktionen hat, zum zerstören von blöcken, wiederhinbauen usw... Wenn das spiel fertig ist, tu ichs in den Showroom und poste hier einen link


    Wenn du von der Picturebox erbst, ist deine neue Klasse auch eine voll implementierte PictureBox, was deiner Aussage widerspricht, nicht lauter PictureBoxen zu erstellen.
    Vererbung nochmal nachlesen, wenn du wach bist und nicht im Schlaf lernen :thumbsup: