![]() |
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: ![]() Quelle: ![]() Wäre nett wenn ihr mir helft. Aso mit links und rechts könnt ihr rotieren ^^ |
Re: Projekt bitte testen - Lag?
Hi,
Code:
Hab die DLLs vom angegebenen Link bezogen.
---------------------------
Ship.exe - Fehler in Anwendung --------------------------- Die Anwendung konnte nicht richtig initialisiert werden (0xc0000142). Klicken Sie auf "OK", um die Anwendung zu beenden. --------------------------- OK --------------------------- |
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...!? |
Re: Projekt bitte testen - Lag?
Die DLLs liegen im Ordner der Anwendung, das sollte in Ordnung sein. Zumindest meckert er nicht, dass was fehlt.
|
Re: Projekt bitte testen - Lag?
Verwendest du Windows? Welches, wenn ich fragen darf?
|
Re: Projekt bitte testen - Lag?
Bei mir kommt folgende Fehlermeldung:
Code:
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
---------------------------
Ship --------------------------- Invalid floating point operation. --------------------------- OK --------------------------- //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 |
Re: Projekt bitte testen - Lag?
Zitat:
|
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 |
Re: Projekt bitte testen - Lag?
Also bei mir funktioniert es einwandfrei.
Gute Graphik!! |
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: |
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 |
Re: Projekt bitte testen - Lag?
Gleiches Problem wie littleDave. XP Pro SP2 768MB RAM GeForce 7600GT
|
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:
Irgendwer ne Idee? Kenne mich mit solchen Sachen leider nicht so aus (Fehlern und so :D).
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; |
Re: Projekt bitte testen - Lag?
Ich hab XP-Home und FPS ist immer 60
|
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:
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.
procedure Set8087CW(NewCW: Word); assembler;
asm MOV Default8087CW, AX end; procedure TForm1.FormCreate(Sender: TObject); begin {$IFDEF CPU386} Set8087CW($133F); {$ENDIF} // .... end; 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. |
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! |
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:
//Edit: Floating-Point-Problem besteht immer noch :-( |
Re: Projekt bitte testen - Lag?
Ok, super danke für die klasse Erklärung. Und wieder ein kleines bisschen schlauer :)
|
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. |
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. |
Re: Projekt bitte testen - Lag?
Klappt die neue Version denn nun bei euch? :)
|
Re: Projekt bitte testen - Lag?
Zitat:
Wenn du bereit wärest, mir den Quelltext zu geben, könnte ich das hier mal debuggen und den Fehler für dich suchen. |
Re: Projekt bitte testen - Lag?
Zitat:
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 ![]() |
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. |
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 |
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 |
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 ;-) |
Re: Projekt bitte testen - Lag?
Zitat:
|
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