AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OpenGL zu wenig Frames

Ein Thema von roboter202 · begonnen am 24. Okt 2011 · letzter Beitrag vom 31. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#1

OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:13
Hallo,

eigentlich seid ihr ja nicht dafür verantwortlich aber da ich auf dem Forum von http://www.delphigl.com/ noch nicht freigeschaltet wurde frag ich hier mal nach.

Ich hab mal das 1. Beispiel ausprobiert was es da als Tutorial gab. Ein Viereck auf schwarzen Hintergrund. Der Code ist 1:1 übernommen aber trotzdem habe ich nur 60 Frames. Die CPU ist kaum ausgelastet < 2%, wenn ich jedoch das Fenster in den Hintergrund schiebe geht die Auslastung hoch > 80%. Das sollte eig. anders sein .
Vielleicht sollte ich sagen das ich bei wie ich denke ressourcenfressenderen Spielen (GTA SA, Minecraft, RSV2, ...) wesentlich mehr Frames (> 100) habe.

Die Grafikkarte (POV GeForce GT440) ist noch sehr neu und sollte bei so einem "Bildchen" nicht in die Knie gehen. Der Prozessor ist zwar nicht der neuste aber an der Auslastung sollte man erkennen das auch hier mehr drin ist.

Es kann natürlich auch sein das der Code selbst suboptimal ist.

CODE:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DGLOpenGL;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
  private
    { Private-Deklarationen }
    StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
    Frames, DrawTime : Cardinal; //& Timebased Movement
    procedure SetupGL;
    procedure Init;
    procedure Render;
    procedure ErrorHandler;
  public
    { Public-Deklarationen }
    DC : HDC; //Handle auf Zeichenfläche
    RC : HGLRC;//Rendering Context
  end;

var
  Form1: TForm1;

const
  NearClipping = 1;
  FarClipping = 1000;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DC:= GetDC(Handle);
    if not InitOpenGL then Application.Terminate;
    RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
    ActivateRenderingContext(DC, RC);
    SetupGL;
    Init; //Was man sonst so initialisieren will.
end;

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
  glEnable(GL_CULL_FACE); //Backface Culling aktivieren
end;

procedure TForm1.Init;
begin
  Application.OnIdle := IdleHandler;
end;

procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
 
  glTranslatef(0, 0, -5);
 
  glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  glEnd;
 
  SwapBuffers(DC);
end;

procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  StartTime:= GetTickCount;
  Render;
  DrawTime:= GetTickCount - StartTime;
  Inc(TimeCount, DrawTime);
  Inc(FrameCount);
 
  if TimeCount >= 1000 then begin
    Frames:= FrameCount;
    TimeCount:= TimeCount - 1000;
    FrameCount:= 0;
    Caption:= InttoStr(Frames) + 'FPS';
    ErrorHandler;
  end;
 
  Done:= false;
end;

procedure TForm1.FormResize(Sender: TObject);
var tmpBool : Boolean;
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  IdleHandler(Sender, tmpBool);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
end;

procedure TForm1.ErrorHandler;
var s: String;
begin
  s := gluErrorString(glGetError);
  If s <> 'no errorthen showmessage(s);
end;


end.
PS: Ich verwende die OnIdle Routine zum Aufruf des Renderns.
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:17
Es scheint VSync aktiv. Da ein digitaler Monitor aber nur 60 Bilder/Sekunde anzeigt, besteht auch keine Notwendigkeit mehr frames zu berechnen
Markus Kinzler
  Mit Zitat antworten Zitat
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#3

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:26
Na das mag sein,
Aber auf dem Screenshot von dem Tutorial hat der Typ > 400 Frames.
Und ich hab die Befürchtung das wenn ich jetzt was größeres mache meine Frames doch auch weiter nach unten gehen.
Bei guten Games hat man ja auch > 200 Frames mit High End karten und ist total stolz darauf.
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:28
Wie schon gesagt wurde: wenn du die Frame-Rate nicht begrenzen willst, musst du in deinen OpenGL-Einstellungen der Grafikkarte das VSync abstellen bzw. auf "von der Anwendung gesteuert" einstellen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:29
Dann deaktiviere VSync. macht aber imho keinen Sinn, mehr Frames zu berechnen, als angezeigt werden können.
Markus Kinzler
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:33
Da geht auch nix runter wenn du mehr machst, so lange das Mehr nicht an die Grenzen deines System stößt. Die Begrenzung auf 60 ist "künstlich", und hat nichts damit zu tun, dass hier was ausgelastet wäre. Nimms entweder erstmal so hin, oder deaktivier VSync

Zitat:
> 200 Frames mit High End karten und ist total stolz darauf.
Das trifft nur auf Proleten zu. Ich bin glücklicher, wenn meine Games auf 60FPS meinen PC langweilen, weil dann weiss ich dass noch Luft nach oben ist, und die Kiste grad schön wenig Strom verballert - für einen Effekt, den man nichtmals sieht. Große Zahlen kann ich auch im Notepad schreiben.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (24. Okt 2011 um 12:36 Uhr)
  Mit Zitat antworten Zitat
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#7

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 12:35
Ok dann hab ich > 1200 Frames. Jetzt weiß ich wenigstens das mein Grafik genug kann und ich anfangen kann etwas bessere Dinge mit OpenGL zu machen.

Thx.
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#8

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 15:45
VSync zu deaktivieren macht manchmal schon Sinn und ist nicht nur ein "virtueller Schwanzvergleich".
Sicher, der Monitor kann meist nur 60fps anzeigen, aber VSync wirkt sich bei Hardware-Cursors auch negativ auf die Eingabegeschwindigkeit aus und bewirkt eine Latenz.
Einfach mal nach "VSync Input latency" oder "VSyng Eingabeverzögerung" googeln

Allerdings ist es immer System- und Szenario-abhängig, ob VSync gut oder schlecht ist.

P.S.:

Zitat:
Jetzt weiß ich wenigstens das mein Grafik genug kann und ich anfangen kann etwas bessere Dinge mit OpenGL zu machen
Ja, allerdings..."etwas" mehr....mit der Grafikkarte kannst du ein Crisis 2 nachbauen, ohne dass die in die Knie geht

Geändert von blackfin (24. Okt 2011 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 15:59
Okay, so hardcoremäßig bin ich dann nicht unterwegs, dass Verzögerungen von 1/60 Sekunde meine Performance merklich beeinflussen würden. (Wobei man dieses "Problem" eher mangelhaftem Desing des Spiels zuschreiben müsste, wenn es Eingaben und Spiellogik im selben Thread wie das Rendern erledigt, aaaaber das ist eine andere Diskussion 8))

Während der Entwicklung ist es aber durchaus sinnvoll ohne VSync zu fahren, und sei es um bloß abschätzen zu können, wie viel noch so geht. Beim laufenden Programm stört mich da eher das (auch bei TFTs auftretende) Bei Google suchenTearing - grad bei Shootern.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#10

AW: OpenGL zu wenig Frames

  Alt 24. Okt 2011, 16:33
@Medium: Und genau gegen das Tearing ist VSync gut. Das tearing entsteht durch desynchronisation. Mit VSync darf das nicht passieren, sonst hat da wer was kaputt gemacht
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 14:45 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