Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Mein Spiel -> CPU Auslastung 100% (https://www.delphipraxis.net/53206-mein-spiel-cpu-auslastung-100-a.html)

Neutral General 12. Sep 2005 11:37


Mein Spiel -> CPU Auslastung 100%
 
Wenn ich mein Spiel starte und und mein Formular aktiv ist, steigt die CPU-Auslastung im Taskmanager sofort auf 100%. Ich benutze DelphiX. Woran kann das liegen ?

Luckie 12. Sep 2005 11:39

Re: Mein Spiel -> CPU Auslastung 100%
 
Zitat:

Zitat von Neutral General
Woran kann das liegen ?

An deinem Code.

mbamler 12. Sep 2005 11:44

Re: Mein Spiel -> CPU Auslastung 100%
 
Zitat:

Zitat von Neutral General
Wenn ich mein Spiel starte und und mein Formular aktiv ist, steigt die CPU-Auslastung im Taskmanager sofort auf 100%. Ich benutze DelphiX. Woran kann das liegen ?

Ich glaube, dass liegt entweder an DelphiX oder an DirectX
(will sagen: dein Code kann da nur bedingt was für)

Egal welches DirectX Programm ich mit DelphiX bisher geschrieben habe - immer ist die CPU auslastung auf 100%
(du bist also nicht alleine)

Gruß
Matthias

Neutral General 12. Sep 2005 11:45

Re: Mein Spiel -> CPU Auslastung 100%
 
*g* Luckie wie alle ihn kennen :mrgreen:

da es ja die Auslastung dauernd 100% ist kann es ja nur an Code liegen der dauernd ausgeführt wird.
Also :
Delphi-Quellcode:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  DXInput1.Update;
  DXSpriteEngine1.Move(1);
  DXDraw1.Surface.Fill(0);
  DXSpriteEngine1.Draw;
  DXDraw1.Flip;
end;
oder

Delphi-Quellcode:
procedure TSpieler.DoMove(MoveCount : Integer);
var Strecke : Double;
    xWeg,yWeg, xDiff,yDiff, Schritte : Double;
begin
inherited DoMove(MoveCount);
if (IsLeft in Form1.DXInput1.States) and (Move = false) then begin
  aX := Station.Links.X + (Station.Width/2);
  ay := Station.Links.y + (Station.Height/2);
  Move := true;
end;
 if (IsRight in Form1.DXInput1.States) and (Move = false)then begin
  aX := Station.Rechts.X + (Station.Width/2);
  ay := Station.Rechts.y + (Station.Height/2);
  Move := true;
end;

if Move = true then begin
  xWeg := Ax -x;
  yWeg := Ay -y;
  Strecke := Sqrt(Sqr(xWeg)+Sqr(yWeg));
  Schritte := Round(Strecke / 2);
  if Schritte = 0 then Schritte := 20;
  xDiff := xWeg / Schritte;
  yDiff := yWeg / Schritte;
  x := x + xDiff;
  y := y + yDiff;

  if (x = Ax) and (Ay = y) then Move := false;
end;
  Collision;
end;
Ansonsten wir bei mir nichts dauernd ausgeführt...

@ mbamler : Mh ok.. dann kann ichs wohl nicht ändern...

3_of_8 12. Sep 2005 11:48

Re: Mein Spiel -> CPU Auslastung 100%
 
Wie hoch ist der Timer.Interval?

Tubos 12. Sep 2005 11:50

Re: Mein Spiel -> CPU Auslastung 100%
 
Zitat:

Wenn ich mein Spiel starte und und mein Formular aktiv ist, steigt die CPU-Auslastung im Taskmanager sofort auf 100%
Und wo ist da das Problem dabei?
Wenn ich ein Spiel spiele, will ich in der Regel sowieso nichts nebenbei machen. Und wenn ich aus dem Fullscreen-Modus rausgehe (oder das Spiel-Fenster minimiere, jenachdem) und irgendwas anderes mache, soll das Spiel eben unterbrochen werden.

Neutral General 12. Sep 2005 12:08

Re: Mein Spiel -> CPU Auslastung 100%
 
Zitat:

Zitat von 3_of_8
Wie hoch ist der Timer.Interval?

Der Timer Intervall ist 1 aber ist jetzt auch egal.. das bleibt jetzt so und Ende ^^

sniper_w 12. Sep 2005 12:37

Re: Mein Spiel -> CPU Auslastung 100%
 
Versuche es mit Sleep(10);.

Neutral General 12. Sep 2005 12:42

Re: Mein Spiel -> CPU Auslastung 100%
 
sleep beim Haupttimer in DelphiX o.O ? Programmiertes Ruckeln ?^^

Lol von wegen... das geht echt voll gut o.O thx ! Hätt ich echt nicht gedacht... :thumb:

sniper_w 12. Sep 2005 12:43

Re: Mein Spiel -> CPU Auslastung 100%
 
Hast du es VERSUCHT ? :roll:

Neutral General 12. Sep 2005 12:43

Re: Mein Spiel -> CPU Auslastung 100%
 
Wie schon geschrieben es klappt :D
Hätt ich echt nicht gedacht... danke :thumb:

Mr_T 14. Sep 2005 16:00

Re: Mein Spiel -> CPU Auslastung 100%
 
Also das mit dem Timer ist nun echt keine Lösung ^^
Denn: der Timer an sich auf einer 1er Einstellung reduziert die Maximale FPS-Zahl auf 1000 ... da kaum ein Spiel so schnell läuft bedeutet also die Timer-Einstellung von 1: Rendere so schnell du halt kannst - Wahrscheinlich die vernümpftigste Lösung und mit dme OnIdle-Event von Delphi nahezu gleichzusetzen - dieses brasucht auch immer 100% CPU-Power, weil halt so viel und so schnell gerendert wird, wie es halt gerade geht.
Das Sleep(10) bewirkt nun aber, dass nach jedme Rendern erstmal 10 Millisekunden Pause gemacht werden, bevor deine Anwendung weiterarbeitet ... eher friert sie für die Zeit ein udn der Prozie arbeitet solange an anderen Prozessen, deshlab hat er nicht 100% Last .... Aber: damit reduziert man die Maximale FPS-Zahl auf 100 (bei der Idealen Hardware, die keien Zeit zum Rendern bräuchte) ... auf langsamen Maschienen hingegen wird dieses zum Overkill ... man stelle sich das Szenario vor, das die Application mit ca 20 Frames pro Sekunde läuft ... in der Regel noch so eben akzeptabel. Nun aber bewirkt man mit dem Sleep(10), das statt 50 Ms 60 gebraucht werden für einen Frame, also die FPS-Zahl auf ca 18 sinkt ... mag nicht viel klingen, ist aber ärgerlich ^^
Also: Leute, lasst doch eure Anwendungen so schnell Rendern wie sie wollen ... und wenn ihr noch nebenher was machen wollt, denn nehmt keinen Timer oder ähnlichen Spielkram, sondern das OnIdle-Event, da immer denn nur was machen soll, wenn alle anderen Prozesse nichts zu tun haben ...

DGL-luke 14. Sep 2005 16:14

Re: Mein Spiel -> CPU Auslastung 100%
 
@Mr_T: Du hast vollkommen recht, ein sleep(10) ist absolut suboptimal - trotzdem wird ein OnIdle mit Done:=false immer 100% Prozessorlast zur folge haben.

Somit also zwei Möglichkeiten: Done:=true - es wird erst wieder gerendert, wenn sich irgendwas verändert hat. Das ist gut, wenn im Render-ereignis absolut keine Berechnungen(timebased movement etc.) vorkommen. Wenn diese also alle ausserhalb passieren, hat man die ideale frame rate und theoretisch dürfte es nicht ruckeln. Für ein kleines 3d-fenster z.B. in einem Tool sollte das reichen.

oder

Die Lösung mit dem Timer. Damit(TTimer.Interval) kann man effektiv die maximale Framerate festlegen.

Für ein Hochleistungs-3d-Spiel wird aber so gut wie immer die einfache OnIdle-mit-done:=false-lösung die einfachste und richtigste bleiben. Wiederum anders sieht es bei Laptops aus - hier sollte man immer zumindest per config-datei eine möglichkeit zur begrenzung anbieten.

:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz