AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Projekt bitte testen - Lag?
Thema durchsuchen
Ansicht
Themen-Optionen

Projekt bitte testen - Lag?

Ein Thema von .chicken · begonnen am 23. Mai 2008 · letzter Beitrag vom 24. Mai 2008
Antwort Antwort
Seite 2 von 3     12 3      
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#11

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 14:08
@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"
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 14:13
Gleiches Problem wie littleDave. XP Pro SP2 768MB RAM GeForce 7600GT
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#13

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 14:17
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 ).
  Mit Zitat antworten Zitat
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#14

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 14:17
Ich hab XP-Home und FPS ist immer 60
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#15

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 14:34
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.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#16

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 14:51
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!
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#17

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 15:18
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
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#18

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 15:22
Ok, super danke für die klasse Erklärung. Und wieder ein kleines bisschen schlauer
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#19

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 15:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#20

Re: Projekt bitte testen - Lag?

  Alt 23. Mai 2008, 15:48
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 ).
Aber ich denke, dass ab 50 FPS und aufwärts alles als flüssig empfunden wird.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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