Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Projekt bitte testen - Lag? (https://www.delphipraxis.net/114307-projekt-bitte-testen-lag.html)

.chicken 23. Mai 2008 00:23


Projekt bitte testen - Lag?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi, also ich habe hier n kleines Testprojekt meiner 2DX-Engine. Könntet ihr wohl kurz testen ob das ganze laggt? Ich habe oben links einen FPS-Counter, der zählt bei mir dauerhaft 60, egal ob ich die Sachen 1 oder 10 mal pro Timeraufruf rendern lasse (sind bisher ja auch nicht viele Objekte). Trotzdem habe ich das Gefühl, dass das Programm bei höheren Bewegungsgeschwindigkeiten laggt (der Hintergrund).

Könntet ihr das wohl kurz testen und mir sagen was ihr denkt? Habe ich einfach die Bewegungsgeschwindigkeit zu hoch? Was mache ich denn dann, wenn ich so hohe Geschwindigkeiten simulieren will?
Oder bilde ich mir das nur ein?

PS: Ihr braucht die D3D9.dll und D3DX9.dll. Gibt es hier:
http://www.minfos.de/download/header.zip
Quelle: http://www.minfos.de/buch/support.shtml

Wäre nett wenn ihr mir helft.
Aso mit links und rechts könnt ihr rotieren ^^

Die Muhkuh 23. Mai 2008 00:27

Re: Projekt bitte testen - Lag?
 
Hi,

Code:
---------------------------
Ship.exe - Fehler in Anwendung
---------------------------
Die Anwendung konnte nicht richtig initialisiert werden (0xc0000142). Klicken Sie auf "OK", um die Anwendung zu beenden.
---------------------------
OK  
---------------------------
Hab die DLLs vom angegebenen Link bezogen.

.chicken 23. Mai 2008 00:40

Re: Projekt bitte testen - Lag?
 
Hui, ok, das irritiert mich. Danke erstmal für den Versuch das zu testen.
Hast du alle Dateien in einem Ordner und die Dlls im System32 Verzeichnis?
Ich habe keine Idee woher der Fehler kommen koennte...!?

Die Muhkuh 23. Mai 2008 00:47

Re: Projekt bitte testen - Lag?
 
Die DLLs liegen im Ordner der Anwendung, das sollte in Ordnung sein. Zumindest meckert er nicht, dass was fehlt.

.chicken 23. Mai 2008 00:54

Re: Projekt bitte testen - Lag?
 
Verwendest du Windows? Welches, wenn ich fragen darf?

littleDave 23. Mai 2008 11:48

Re: Projekt bitte testen - Lag?
 
Bei mir kommt folgende Fehlermeldung:
Code:
---------------------------
Ship
---------------------------
Invalid floating point operation.
---------------------------
OK  
---------------------------
Ich sehe dann zwar das Fenster, aber das Panel bleibt leer. Die DLLs sind bei mir ebenfalls im Programmordner. Verwende Windows XP Professional SP 2, AMD X2 4800+, GeForce 7600 GT, 2 GB RAM

//Edit:
Dein FPS-Problem (ständig 60 FPS) klingt sehr danach, dass du vSync anhast. Weiß nicht, wie man das mit DirectX abstellt, aber normalerweise sollte jeder anständiger Treiber vSync generell abschalten können. Bei mir (nVidia) geht das hier:
Rechtsklick aufm Desktop -> NVIDIA Control Panel -> 3D-Einstellungen verwalten -> Vertikale Synchronisierung -> Automatisch aus

Die Muhkuh 23. Mai 2008 11:50

Re: Projekt bitte testen - Lag?
 
Zitat:

Zitat von .chicken
Verwendest du Windows? Welches, wenn ich fragen darf?

Vista.

EWeiss 23. Mai 2008 11:52

Re: Projekt bitte testen - Lag?
 
Kann es sein das noch ne DLL fehlt ?
Abhängig von der 9X version directx9 c , d.. da ändert sich doch der Name der 9 Version
wenn ich mich nicht täusche.

EDIT:
prüf mal die zuordnungen mit 'Dependencies Walker'

gruss Emil

bigben37 23. Mai 2008 12:27

Re: Projekt bitte testen - Lag?
 
Also bei mir funktioniert es einwandfrei.

Gute Graphik!!

inherited 23. Mai 2008 13:04

Re: Projekt bitte testen - Lag?
 
[klugscheissen]Lag hat etwas mitkurzzeitigen Verzögerungen bei Netzwerktransfer zu tun, nichts mit der Geschwindigkeit mit der ein Spiel hardwarebedingt läuft[/klugscheiss]
:duck:

.chicken 23. Mai 2008 13:08

Re: Projekt bitte testen - Lag?
 
@EWeiss: Was meinst du soll ich mir ansehn? Was ist das? ^^

@BigBen: Was für ein Betriebssystem hast du denn? Wieviele Frames werden denn angezeigt? Also er geht bei mir nie höher als 60FPS, aber selbst wenn ich (in meiner neuen Demo) sehr viele Pbjekte hinzufüge, verändern sich die Frames nicht. Erst wenn pro Sekunde 10 und mehr Objekte hinzugefügt und nichtmehr gelöscht werden, gehen die Frames langsam runter.

@Muhkuh: Hm also dann könnte ich mir vorstellen dass es an Vista liegt, aber warum das Problem auftaucht, habe ich keine Ahnung !?
Ich hab XP und es läuft super.

@inherited: Endschuldige meine falsche Wortwahl, ich meinte natürlich "Ruckeln" :D

Fussball-Robby 23. Mai 2008 13:13

Re: Projekt bitte testen - Lag?
 
Gleiches Problem wie littleDave. XP Pro SP2 768MB RAM GeForce 7600GT

.chicken 23. Mai 2008 13:17

Re: Projekt bitte testen - Lag?
 
Oh, littleDaves Betrag hatte ich übersehen, sorry.Also ich berechne die Frames in einem von mir erstellten Timer, der mittles On-Idle funktioniert, ich denke es liegt daran!?

Zu dem Problem: Hm also ich benutze XP-Home, ihr Pro, vll liegt es daran. Aber ich kann mir nicht erklären wo da ein Problem sein sollte...vielleicht bei den Einstellungen, mit denen DirectX initialisiert wird. Ich stelle das mal rein:
Delphi-Quellcode:
constructor T2DXSurface.Create(_Handle: hWnd; _Fullscreen: Boolean; _Width, _Height: Longint);
var
  D3DPP: TD3DPresent_Parameters;
  D3DDM: TD3DDisplayMode;
  DType: TD3DDevType;
  D3DCaps9: TD3DCaps9;
  HardwareVertexProcessing: Boolean;
  VertexProcessing: Integer;
begin
  //Initialisierung: IDirect3D9-Interface
  D3D := Direct3DCreate9(D3D_SDK_VERSION);
  if (D3D = nil) then
    Exit;
  //Present_Parameters
  FillChar(D3DPP, sizeof(D3DPP), 0);
  with D3DPP do
  begin
    Windowed := not _Fullscreen;
    SwapEffect := D3DSWAPEFFECT_DISCARD;
    if (_Fullscreen) then
    begin
      BackBufferWidth := _Width;
      BackBufferHeight := _Height;
      BackBufferFormat := D3DFMT_A8R8G8B8;
    end
    else
    begin
      if failed(D3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, D3DDM)) then
        Exit;
      BackBufferFormat := D3DDM.Format;
    end;
  end;
  //Kontrollieren ob die Grafikkarte HardwareVertexProcessing unterstützt
  D3D.GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DCaps9);
  HardwareVertexProcessing := D3DCaps9.DevCaps and D3DDEVCAPS_HWTRANSFORMANDLIGHT <> 0;
  If HardwareVertexProcessing then
    VertexProcessing := D3DCREATE_HARDWARE_VERTEXPROCESSING
  else
    VertexProcessing := D3DCREATE_SOFTWARE_VERTEXPROCESSING;
  //Hardwarebeschleunigung
  DType := D3DDEVTYPE_HAL;
  //Erstellen des IDirect3DDevice9
  if failed(D3D.CreateDevice(D3DADAPTER_DEFAULT, DType, _Handle, Vertexprocessing, D3DPP, Device)) then
    Exit;
  //Erfolgreiche Initialisierung

  //Einstellungen
  FWidth := _Width;
  FHeight := _Height;
  Device.SetRenderState(D3DRS_LIGHTING, Longword(False));
  Device.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  Device.SetRenderState(D3DRS_ZENABLE, Longword(FALSE));
  Device.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
  Device.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
end;
Irgendwer ne Idee? Kenne mich mit solchen Sachen leider nicht so aus (Fehlern und so :D).

bigben37 23. Mai 2008 13:17

Re: Projekt bitte testen - Lag?
 
Ich hab XP-Home und FPS ist immer 60

littleDave 23. Mai 2008 13:34

Re: Projekt bitte testen - Lag?
 
Also zu dem Floating-Point-Problem: dafür musst du die CPU anweisen, genauer zu arbeiten bzw. invalide Operations zu "ignorieren". Das kannst du mit folgendem Befehl machen, den du am besten als allererstes (entweder im initialization-Teil einer unit oder im FormCreate-Event) aufrufst

Delphi-Quellcode:
procedure Set8087CW(NewCW: Word); assembler;
asm
  MOV Default8087CW, AX
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  {$IFDEF CPU386}
    Set8087CW($133F);
  {$ENDIF}
  // ....
end;
Nun nochmal zum FPS-Problem: wie ich bereits schon vorher gesagt habe, liegt das an der aktivieren vertikalen Synchronisation. Ich weiß nicht, wie man das mit DirectX abstellt, ich kenn nur den OpenGL-Befehl. Aber vSync kann man normalerweise im Konfigurationsmenü des Grafikkarten-Treiber deaktivieren.
Wenn dein Timer auf das OnIdle-Event basiert, dann ist das kein Problem für große FPS-Zahlen. Wenn du den normalen VCL-Timer benutzt mit einem Intervall von 1, dann wirst du eine maximale FPS-Zahl von ca. 50-70 erreichen. Aber mit dem OnIdle-Event kann man locker 5000 FPS und mehr erreichen.

.chicken 23. Mai 2008 13:51

Re: Projekt bitte testen - Lag?
 
Super, danke Dave. Also zum Floating-Point-Problem: Kannst du mir nochmal erklären warum das auftritt? Reicht es, wenn ich es oben in das Create des Surfaces packe, damit es immer beim Verwenden der Engine gemacht wird?

Zum FPS-Problem: Ich werde mal sehen wie ich das in DirectX abstelle. Aber ist das nicht ein Problem? Es bedeutet doch, dass der Flip der Buffer erst durchgeführt wird wenn nichts mehr gezeichnet wird (oder so aehnlich?).
Dh ist das nicht eigentlich recht sinnvoll?

Edit: Wenn ich VSync abstelle dann komme ich auf 1900FPS. Die Frage ist nun: Abstellen oder nicht?

Edit2: Hab die neue Version drangehängt, wäre schön wenn ihr nochmal testet!

littleDave 23. Mai 2008 14:18

Re: Projekt bitte testen - Lag?
 
Floating-Point-Problem:
Gerade bei DirectX/OpenGL - Sachen kann es sehr oft vorkommen, dass du durch sehr kleine Werte dividieren musst (z.B. 0,00000001). Wenn du jetzt den Flag von gerade nicht setzt, dann kann es sein, dass die CPU denkt, du teilst durch 0. Die CPU rundet sozusagen und eine Division durch 0 ist ja nicht so dolle. Wenn du diesen Flag jetzt aber setzt, dann rundet die CPU nicht und versucht das Ergebniss trotzdem auszurechnen. Wenn du dann mal wirklich durch 0 teilst, wird keine Exception ausgelöst, sondern das Ergebniss bekommt einen bestimmten Flag (kannst mal bei der Definition von IEEE nachschauen, welches Bit dafür gesetzt wird). Es gibt verschiedene Flags, die zeigen, ob die Floating-Point-Zahl gültig ist. Es gibt z.B. NaN (not a Number) oder Inf (infinity). Das kannst du einfach ausprobieren:
Schreibe ein kleines Program, bei dem du den Flag aktivierst. Dann erstellst du eine Floating-Point-Division, die durch 0 Teilt (25.0 / 0.0). Das Ergebniss gibst du dann per FloatToStr in ein Label. Dort wirst du dann keine Zahl sondern INF darstehen haben.

Der Flag sollte allerdings einmal und wenn möglich gleich zu Beginn des Programms gesetzt werden.

Vertikale Synchronisation:
An sich ist das eine sehr gute Sache - auch wenn sie sehr verwirrend ist (wieso hab ich nur 60 FPS ;-)). Es ist nun so: Wenn vSync aktiviert ist, dann sendet die Grafikkarte den gerenderten Buffer erst zum Bildschirm, wenn dieser mit dem letzten Bild fertig ist. Die Herzzahl des Monitors (bei TFTs 60Hz) sagt, wie schnell der Bildschirm ein neues Bild aufbauen kann (das hat nichts mit der Reaktionszeit zu tun, damit ist eher das Nachleuchten der einzelnen Pixels gemeint). Jetzt ist es bei abgeschalteten vSync so:
Die Grafikkarte rendert ein Bild und schickt es zum Monitor. Der baut das Bild dann zeilenweise auf. Während der Monitor aber noch nicht fertig ist, hat die Grafikkarte bereits ein neues Bild gerendert. Also bekommt der Monitor während dem Aufbau des alten Bildes bereits die Information des neuen Bildes und zeichnet dann mit den neuen Informationen weiter. Bei statischen Sachen ist das nicht schlimm, da sich das alte nicht vom neuen Unterscheidet. Aber gerade bei unteschiedlichen Bildern kann es dann zu Bildfehlern kommen, da zwei unterschiedliche Bilder kombiniert werden. Das kann man z.B. sehen, wenn man ein sich in einem Ego-Shooter immer im Kreis dreht. Dann kann es sein, dass die obere hälfte des Bildschirms die alte Rotation zeigt und der untere Teil die neue Rotation. Somit enstehen Bildversetzungen, die sehr komisch aussehen.
Was aber ganz wichtig ist: vSync beeinflusst nicht, in welchem Zustand der Buffer an den Bildschirm geschickt wird. Der Buffer wird immer nur dann zum Bildschirm geschickt, wenn er fertig ist. VSync sagt dann nur, ob die Grafikkarte mit dem Senden noch warten soll bis der Bildschirm fertig ist.

vSync sollte meiner Meinung nach immer aktiviert sein (außer bei Benchmarks). Das hat mehrere Vorteile:
  • Bei Laptops spart diese Einstellung Strom, da die Grafikkarte nicht immer ausgelastet ist
  • Kleine FPS-Zahlen bedeuten größere DeltaTimes. Dadurch werden Floating-Point-Operationen genauer
  • Es enstehen keine ungewollten Bildfehler
Für Testzwecke kann man vSync schon mal ausschalten, um zu sehen, wie schnell das Programm läuft. Aber in der finalen Anwendung ist es dann doch egal, ob nun 60 FPS oder 300 FPS angezeigt wird. Menschen sehen alles ab 25 FPS flüssig (mache erst ab 30 FPS), aber niemand kann sagen, dass er einen Unterschied zwischen 60 und 300 FPS erkennen kann - das kann unser Auge und unser Gehirn nicht.

//Edit: Floating-Point-Problem besteht immer noch :-(

.chicken 23. Mai 2008 14:22

Re: Projekt bitte testen - Lag?
 
Ok, super danke für die klasse Erklärung. Und wieder ein kleines bisschen schlauer :)

Namenloser 23. Mai 2008 14:24

Re: Projekt bitte testen - Lag?
 
Also zwischen 60 und 80 Frames pro Sekunde gibt es bei mir zumindest einen gefühlten Unterschied. Vielleicht liegt das daran, dass mein Monitor eine Bildwiederholungsrate von 75 Hz hat.
Ich denke außerdem, dass es einen Unterschied zwischen "Bewegung wahrnehmen" und "flüssig" gibt. Es komtm auch auf die Situation drauf an. Bei einem Kinofilm empfinde ich 24 Bilder pro Sekunde als flüssig. Bei einem Autorennspiel kommen mir weniger als 40-50 fps ruckelig vor.

littleDave 23. Mai 2008 14:48

Re: Projekt bitte testen - Lag?
 
Ich denke auch, dass diese 25 FPS situationsabhängig sind. Ich hab bei mir z.B. festgestellt, dass ich bei einer dunklen Umgebung und bei einer dunklen Bildschirmeinstellung Spiele flüsser empfinde als bei einer hellen Umgebung. Der Konstrast spielt da bestimmt eine große Rolle. Bei Filmen hat man ja sehr weiche Kontrastübergänge und bei Spielen ist das meinstens etwas abgehackter. Ich bin jetzt kein Mediziner, doch ich würd sagen, dass sich Animationen, die sich auf einem sehr kontrastreichen Hintergund ereignen erst bei höheren FPS-Zahlen als flüssig empfunden werden. Außerdem spielt die Anzahl der Umgebungsreize meiner Meinung nach eine große Rolle. Bei einem Film bewegt sich meistens extrem viel im Hintergrund (Bäume, Statisten usw.). Bei einem Rennspiel ist der Hintergrund meistens aus Performance-Grunden relativ statisch und bewegt sich "nur" in Richtung Betrachters (außer natürlich im Rückwärtsgang :mrgreen:).
Aber ich denke, dass ab 50 FPS und aufwärts alles als flüssig empfunden wird.

.chicken 23. Mai 2008 19:43

Re: Projekt bitte testen - Lag?
 
Klappt die neue Version denn nun bei euch? :)

Fussball-Robby 23. Mai 2008 21:32

Re: Projekt bitte testen - Lag?
 
Zitat:

Zitat von .chicken
Klappt die neue Version denn nun bei euch? :)

Leider nicht. Beim ersten Start kam eine Zugriffsverletzung beim Lesen von Speicher 00000000. Und ab dann gabs wieder bei jedem Start ne Invalid floating point operation...
Wenn du bereit wärest, mir den Quelltext zu geben, könnte ich das hier mal debuggen und den Fehler für dich suchen.

Muetze1 23. Mai 2008 22:12

Re: Projekt bitte testen - Lag?
 
Zitat:

Zitat von littleDave
Also zu dem Floating-Point-Problem: dafür musst du die CPU anweisen, genauer zu arbeiten bzw. invalide Operations zu "ignorieren". Das kannst du mit folgendem Befehl machen, den du am besten als allererstes (entweder im initialization-Teil einer unit oder im FormCreate-Event) aufrufst

Nicht die CPU sondern die FPU und genauer deren Control Word änderst du damit. Aber wozu zum Teufel? Rechnet richtig. Das ist ein typischer Fall von Fehler verstecken anstatt zu beseitigen. Dieser Code bzw. diese Lösung ist totaler Humbug.

Und wenn ungültige Werte auftauchen, dann muss man diese entsprechend verhindern oder direkt dort mit IsNAN(), etc arbeiten.

Und noch ein Hinweis: "Invalid Floating Point" Fehler bekommt man auch leicht, wenn man direkt mit LoadLibrary() DLLs lädt, welche mit dem Microsoft Visual Studio erstellt wurde. Hintergrund: Der Startup/Initcode von Visual Studio für die DLL verändert genau dieses Control Word der FPU so, dass diese mehr Fehler meldet, als Delphi erwartet. Exra für dieses (schon lange bekannte) Problem liefert CodeGear seit Delphi 4 (vllt. auch schon 3?) die Delphi-Referenz durchsuchenSafeLoadLibrary() Funktion mit, welche als Ersatz zu der LoadLibrary() Funktion bei solchen DLLs verwendet werden sollte. Diese Funktion sichert das Control Word und stellt es nach dem Laden wieder her.

Garfield 24. Mai 2008 12:19

Re: Projekt bitte testen - Lag?
 
Die erste Version läuft mit 60/61, die zweite mit 62/63. Wenn der Rechner noch was anderes macht, geht die zweite Version auch mal auf 49 runter.

Athlon XP 2000+, GeForce 2 MX 400, Win XP SP3.

Crazy Ivan 24. Mai 2008 13:21

Re: Projekt bitte testen - Lag?
 
also wenn das oben links die frames sind, dann habe ich immer ca. 4200 :D aber es variiert auch ein bisschen, allerdings werden es nie weniger als 4100

WinXP SP3, AMD Opteron 180 und ATI Radeon X3870

Mikender 24. Mai 2008 13:34

Re: Projekt bitte testen - Lag?
 
Also erstmal sehr cooles Programm(was bisher da ist :-D ) und echt gute Grafik
(schon mal an Open-Source gedacht :?: )

ABER: Die FPS anzeige stimmt irgendwie nicht sie schwankt immer zwischen 347 FPS und 542 FPS seltsam :mrgreen: :zwinker: läuft aber flüssig :thumb:

PS: Bevor ihr fragt ich habe einen mittelmäßigen Windows XP Professional
PS²: Du machst das mit OpenGL oder ?
PS³: Das da oben sind doch die FPS (HILFE mir gehen die Hochzahlen aus :-D )
PS^4: du könntest wenn das so wäre aber auch FPS dahinter schreiben :-D

.chicken 24. Mai 2008 17:20

Re: Projekt bitte testen - Lag?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, also danke nochmal an alle fürs Testen. Ich verstehe nicht woher der Fehler kommt. Bei mir funktioniert es einwandfrei, auch ohne die Zeile oben im Code.

@Mikender: Was interessiert dich denn am Code? Willst du den Code meiner "Engine"?

Also ich hänge mal das gesamte Projekt + die Dateien der Engine an. Ich hoffe dann könnt ihr mir sagen woran das liegt. :)

PS: Die Grafiken mache ich bisher mit Cinema4D. Werde da für die "richtige Version" (habe vor daraus ein Spiel zu machen, dass dann mit der Engine erweitert wird) aber noch mehr Arbeit reinstecken ;-)

Mikender 24. Mai 2008 21:20

Re: Projekt bitte testen - Lag?
 
Zitat:

Zitat von .chicken
@Mikender: Was interessiert dich denn am Code? Willst du den Code meiner "Engine"?

UUUps, sorry :oops: (kommt davon wenn man 2 Beiträge gleichzeitig schreiben will :-D )


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.

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