C# SDL.Net CPU Auslastung

Shogoki92

Mitglied
Hallo
Ich habe eine mit SDL.Net einen kleinen Moorhuhnclone in C# geschrieben
Allerdings bekomme ich immer eine Hohe CPU Auslastung (55% bei Intel E6750)

Ist dass normal bei einer SDL.net anwendung?
Wenn ja, kann man da irgend was dran ändern um die CPU zu entlasten?

Oder hab ich da nen Fehler gemacht irgendwo?

Ich hoffe ihr könnt mir helfen.
Schonmal Danke im vorraus.

MfG Shogoki92

PS.: Ich poste hier jetzt erstmal keinen Code, da ich ja nichtmal weis ob ich einen Fehler gemacht habe oder so und daher auch garnicht weis an welcher stelle der fehler leigen könnte.
 
Deine CPU ist ein DualCore-Prozessor, die 55 % bedeuten also, dass zumindest ein Kern komplett ausgelastet ist mit deinem Spiel.
In SDL.Net kann man ja einstellen, wie oft pro Sekunde das Spiel-Aktualisieren-Event (Tick) gefeuert werden soll. Wahrscheinlich hast du das mindestens auf 60 gestellt.
Möglicherweise ist deine Zeichen-Funktion sehr aufwendig? Oder die Methode zur Kollisions-Bestimmung?
Wenn man sich andere Spiele anschaut, dann gibt das ähnliche Werte, weil einfach eine Endlossschleife verwendet wird, die dann halt so oft wie möglich durchläuft. Das hast du hoffentlich nicht gemacht?
 
Zuletzt bearbeitet:
Erstmal Danke ür die Antwort
wahrscheinlich hast du recht .
Als ich Habe Events.Fps auf 60 aber hab auch mal probiert wenn ich das runterregle ändert sich nicht viel

und in meinem Tick Event siehts so aus
C#:
 public void SDL_Tick(object sender, TickEventArgs e)
        {
            //cursor auf aktuelle Mausposition festlegen
            Point mousep = Mouse.MousePosition; // Mausposition in Punkt mousep speichern
            mousep.X -= 26; mousep.Y -= 25; //Mitte des Cursors 

            Rect_cursor = new Rectangle(mousep.X, mousep.Y, Sur_cursor.Width, Sur_cursor.Height);

            if ((pause)||(name))  goto nachbewegung; // Wenn Pause oder Namenseingabe Bewegung überspringen
            // Bewegung der Fische 
            for (int i = 0; i <= 3; i++)
            {
                Rect_fish[0, i].X -= 3; //fischen um 3 PixelproTick verschieben
                
                //Fische wenn sie am linken Rand angekommen sind wieder an den rechten zeichnen
                if (Rect_fish[0, i].X <= 3) { Rect_fish[0, i].X = Sur_game.Width - anim_fish.Width; }
            }

            nachbewegung:
            //Auf Sur_Game (Spielwelt zeichnen)
            Sur_game.Blit(background[0,bg_index]);//hintergrund zuerst zeichnen
            //Fische zeichnen
            for (int i = 0; i <= 3; i++)
            {
                //Fischanimation in dei Rectangles Blitten
                Sur_game.Blit(anim_fish, Rect_fish[0, i]);
            }
            Sur_game.Update(); //Surface Updaten


            //Auf screen(Benutzerbildschirm) zeichnen
            
            //Ausschnitt d. Spieloberfläsche zeichnen
            screen.Blit(Sur_game, Rect_screen, Rect_source);
            //Txt_Sprites zeichnen
            screen.Blit(txt_score, Rect_score);
            screen.Blit(txt_time, Rect_time);

            //Wenn Pause ist dann Pausetext zeigen
            if (pause) screen.Blit(txt_pause, Rect_pause);
            if (name) screen.Blit(txt_pause, Rect_pause);


            //munition zeichnen
            for (int i = 0; i < munition; i++) //schleife von 0 bis 1 kleiner als munition(da Index ab 0)
            {
                screen.Blit(Sur_patrone, Rect_Munition[i]);
            }
            //Cursor zeichnen
            screen.Blit(Sur_cursor, Rect_cursor);
            
            screen.Update(); // Surface Updaten

        }

Meinst du man kann da was dran ändern/verbessern, dass es besser wird?

PS: Hoffe der Code ist verständlich. Ich bin nicht s gut darin für jeden verständliche Kommentare einzufügen
 
Zuletzt bearbeitet:
Naja... also "goto" gehört verboten, schreib das irgendwie anders.
Ich habs jetzt nicht getestet, und eigentlich auch nicht viel dran gemacht.

C#:
public void SDL_Tick(object sender, TickEventArgs e) {
  // Cursor-Bereich ermitteln
  Point mousep = Mouse.MousePosition;
  mousep.X -= 26; mousep.Y -= 25;

  Rect_cursor = new Rectangle(mousep.X, mousep.Y, Sur_cursor.Width, Sur_cursor.Height);

  if (!(pause && name)) {
    for (int i = 0; i <= 3; i++) {
      Rect_fish[0, i].X -= 3; // Fische um 3 Pixel pro Tick verschieben

      // Fische, wenn sie am linken Rand angekommen sind, wieder an den rechten zeichnen
      if (Rect_fish[0, i].X <= 3)
        Rect_fish[0, i].X = Sur_game.Width - anim_fish.Width;
    }
  }

  // komplette Spielwelt zeichnen
  Sur_game.Blit(background[0,bg_index]); // Hintergrund
  
  // Fische
  for (int i = 0; i <= 3; i++)
    Sur_game.Blit(anim_fish, Rect_fish[0, i]);

  Sur_game.Update();


  // aktuell sichtbaren Ausschnitt übertragen
  screen.Blit(Sur_game, Rect_screen, Rect_source);
  
  // Texte zeichnen
  screen.Blit(txt_score, Rect_score); // Punktzahl
  screen.Blit(txt_time, Rect_time);   // Zeit

  // Wenn Pause ist, dann Pausetext zeigen
  if (pause || name)
    screen.Blit(txt_pause, Rect_pause);

  // Munition zeichnen
  for (int i = 0; i < munition; i++)
    screen.Blit(Sur_patrone, Rect_Munition[i]);

  // Cursor zeichnen
  screen.Blit(Sur_cursor, Rect_cursor);

  screen.Update(); // Surface updaten
}

Ich finde es allerdings etwas merkwürdig, dass du mit C# arbeitest, aber scheinbar keinerlei OOP verwendest? Das hilft zwar nicht bei deinem Problem, aber trotzdem.
Vielleicht findet sich jemand, der sich besser auskennt, was man machen könnte, damit es schneller wird. :-(
Wahrscheinlich ist es nicht so gut, dass du zwei Surfaces verwendest, daran könnte man evtl. was machen. Oder liegt das Problem wo anders? Wie siehts mit dem Kollisionstest aus?
 
Zuletzt bearbeitet:
Danke nochmal für die Antwort.

engelmarkus hat gesagt.:
Ich finde es allerdings etwas merkwürdig, dass du mit C# arbeitest, aber scheinbar keinerlei OOP verwendest? Das hilft zwar nicht bei deinem Problem, aber trotzdem.
naja dazu muss ich wohl sagen, dass ich mich damit nicht sonderlich auskenne
da ich nie richtig C# elernt habe ich hab mir das alles so per Learning by Doing so beigebracht da ich und ich halt auch vom VB.Net zu C# gewechselt bin und dieses hier auch mein erste größeres Projekt ist.

Der Code den du geschrieben hast hab ich mal ausprobiert der is oke nur muss es
Code:
if (!(pause || name))
statt
Code:
if (!(pause && name))
heißen.
Aber an der CP auslastung ändert der nicht viel(Ist ja auch eigentlich fast nix dran verändert).

Und jetzt nochmal ne andere Frage: Ich bin nicht oft in deisem Forum und ihc find einfach nirgendwo ne liste mit BB codes usw. Wie ist der BB code für C# code?
 
:offtopic:

ja gibt es. Wer hätte es gedacht [ csharp] ;)

@Shogoki92
Sowohl VB.NET als auch C# sind OOP-Sprachen. Mit dem Thema solltest du dich auseinandersetzen
 
Nico Graichen hat gesagt.:
Sowohl VB.NET als auch C# sind OOP-Sprachen. Mit dem Thema solltest du dich auseinandersetzen

Ja ich habe schon vor mich damit auseinanderzusetzen.
Allerdings kann ich das nach diesem Projekt erst beginnen.(Da dieses Projekt in 1 Monat fertig sein muss, ist nämlich für die Schule)

engelmarkus hat gesagt.:
Magst du mal herzeigen, wie du die Kollisionen überprüfst? Vielleicht ist da das Problem.

C#:
                //Überprüfen ob Fisch getroffen wurde
                for (int i = 0; i <= 3; i++)
                {
                    if (Rect_fish[0, i].Contains(mouse))//Überprüft ob Mauszeiger sich in einem der Rechtecke befindet
                    {
                        
                        //Punkt pixel erstellen (Koordinaten des angeklickten Punktes im Fischrechteck
                        Point pixel = new Point(mouse.X - Rect_fish[0, i].X, mouse.Y - Rect_fish[0, i].Y);

                        //Wenn dieser Punkt die Transparent gesetzte Farbe beinhaltet --> Nichts tun
                       
                        if (anim_fish.Surface.GetPixel(pixel).Equals(transparent)) { }
                        //wenn nicht
                        else
                        {
                            score += 10; // Punkte um 10 erhöhen

                            txt_score.Text = "SCORE:  " + Convert.ToString(score);
                            Rect_score.Width = txt_score.Width; // TXT_Sprite ändern
                            
                        }

                    }

                }

Also Ich rüfe erst ob man in das entsprechende Rechteck geklickt hat und dann ob der Pixel transparent ist, da man in diesem fall ja diie Figur nicht richtig getroffen hat.
 
Ruckelt das Spiel denn? Also ist die hohe CPU-Auslastung ein Problem? Wenn du das Spiel später im Vollbild-Modus laufen hast, ist es ja egal. Vielleicht ist das auch ein Problem in SDL, weil es z. B. die Eingabe-Gerät so oft abfragt wie möglich o. ä.
 
Zurück