ich habe folgendes Problem. Ich habe mir die aktuellen OpenGL Header und das opengl12_api_template herunterladen und compiliert.
Nun zu meinem Problem:
Führe ich nun diese unveränderte Datei auf meinem Laptop aus, sieht man einen schwarzen Bildschirm und eine konstante Framerate, so wie es sein soll. Dieser hat eine ATI Radeon Mobility x700 Grafikkarte.
Auf meinem anderen Computer mit einer nVidia Geforce 6800 Ultra passiert das gleiche, konstante Framerate und ein schwarzer Bildschirm, ABER es passiert noch etwas. Der Speicherverbrauch wächst ungemein und zwar pro Sekunde um 4000 bis 8000 Bytes. Dies ist auf dem Laptop nicht der Fall, konsanter Speicherverbrauch.
Compiliert habe ich das Template einmal mit Delphi 7 und Turbo Delphi, es gab keine Unterschiede an dem Phänomen.
Was ich schon festgestellt habe ist wenn ich in der Deklaration des Pixelformats das Flag PFD_DOUBLEBUFFER herausnehme, steigt nicht nur die Framerate um das 1000 fach auch der steigende Speicherverbrauch ist.
Hat jemand eine Ahnung an was das liegen könne? Ein Bug in den nVidia Treiber, ein Bug von Windows? Und weshalb steigt die Framerate so extrem an? DOUBLEBUFFERED hat doch nix mit VSync zu tun oder etwa doch?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hallo und Willkommen im Forum.
Der Geschwindigkeitszuwachs ist relativ leicht zu erklären. Beim Doublebuffering werden 2 Buffer benutzt. Es wird immer in den Hinteren gezeichnet und bei SwapBuffer werden die Buffer getauscht/umkopiert. Wärend du ohne Doublebuffering natürlich nur in den Sichtbaren kopierst und da sonst nichts gemacht werden muss. Das fällt nur so extrem ins Gewicht, da du sonst noch nichts machst. Später wird das kaum wirklich einen Unterschied machen. Abgesehen davon ohne Doublebuffering kannst du es nicht benutzen, da es halt direkt gezeichnet wird. Das würde flackern ohne ende.
Das mit dem Speicherleck hatte ich bisher so nie. Allerdings ist meine Letzte NVidia Karte auch schon 6 Jahre alt. nd ich weiß so direkt nicht was das Sample macht. Allerdings würde ich dir auch empfehlen, dass du die 1.5er Samples benutzt, da die unseren Header benutzen. Ist aktueller und wird geplegt.
Danke für die Antwort, das mit dem höheren Framerate ist mir nur klar.
Nun zu dem Speicherleck, wo finde ich denn das 1.5er Template auf der Seite gibt es nur die für Version 1.2. Ich habe noch etwas herumgespielt und noch eine andere Beobachtung gemacht. Ich rendere den OpenGL Context auf ein Panel. (unter VCL)
Rufe ich den Befehl Swapbuffer so auf
Code:
OpenGLPanel: TPanel;
...
SwapBuffers(GetDC(OpenGLPanel.Handle));
kommt es auch zu diesem Speicherverbauch Phänomen. Ändere ich aber den Code in
Code:
type
TForm1 = class(TForm)
...
private
PanelDC : HDC;
...
....
procedure TForm1.InitAll;
...
ogHandle := GetDC(OpenGLPanel.Handle);
...
procedure TForm1.Render;
...
Swapbuffers(ogHandle)
end;
um, ist dieser weg. Wieder wächst der Speicherverbrauch der Anwendung um 4000 - 8000 Bytes pro Sekunde.
GetDC dürfte ja nicht für das Leck verantwortlich sein.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Jain. Laut MSDNs bekommt man auch nur das Handle des DCs. Allerdings wenn das nicht wieder frei gegeben wurde (ReleaseDC) dann bekommst du nicht das gleiche Handle. Sondern jedes Mal ein Neues.
Wenn du zum beispiel GetDC, ReleaseDC, GetDC, ReleaseDC machst bekommst du immer das gleiche Handle. Bei GetDc, GetDC, GetDC bekommst du jedes mal ein anderes Handle.
Du solltest normal nur ein Mal GetDC aufrufen. Da der ja die ganze Zeit über gebraucht wird. Falls das Speicherleck doch noch existiert, dann hänge bitte mal das Projekt mit den benötigten Quellen an.
Habe es einmal mit dem GetDC ausprobiert, es stimmt bei jedem Aufruf wird ein anderes Handle zurückgegeben. Somit wäre dies geklärt. War halt schnell ein quick und dirty code und ich wurde erst aufmerksam als ich nach ein paar Minuten ein EOutofResource Fehler bekam.
Das Hauptproblem ist immer der Speicherverbrauch des non-VCL Template.
Es gibt wieder etwas neues. Es scheint eine Unart der neuen nVidia Treiber zu sein. Das Programm wächst pro Sekund 4096 Bytes. Dies geht solange bis er circa 1 MByte (bei einer leeren Szene) geholt hat. Umso mehr man vom Anfang rendert umso weniger Speicher holt sich das Programm, was durchaus seltsam. Ab circa 100 Polygone wird sich kein Speicher mehr geholt und der Speicherverbrauch bleibt konstant. Seltsam das ganze.
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
DasZiesel hat geschrieben:
Es scheint eine Unart der neuen nVidia Treiber zu sein. Das Programm wächst pro Sekund 4096 Bytes. Dies geht solange bis er circa 1 MByte (bei einer leeren Szene) geholt hat.
Hab ne nVidia Geforce 7900GT 512 /AGP, kann das Problem bei leerer Szene unter Detonator 163.71 und 163.75 nicht nachvollziehen. Daher rate ich zu:
Lossy eX hat geschrieben:
Falls das Speicherleck doch noch existiert, dann hänge bitte mal das Projekt mit den benötigten Quellen an.
Die Beobachtung habe ich bei dem opengl12_api_template.zip gemacht was man von dieser Seite herunterlanden kann. Auch bei anderen Demos die mit Delphi compiliert wurde ist mir das Phänomen aufgefallen. Es ist egal welche Delphi Version verwendert wird und auch wo diese compiliert wurde.
Wie geschrieben das Phänomen tritt nur auf meinem Rechner mit der nVidia GeForce 6800 Ultra auf. Auf anderen Rechner die ich zum testen genommen habe mit GeForce 4 und ATI X700 ist es nicht aufgetreten. Der Unterschied der mir jetzt noch auffällt ist wohl, das gf6 Rechner einen Dual Core Prozessor benutzt (AMD X2). Interessanter Weise holt sich das Programm in je 4096 Bytes/s Blöcken ungefähr 1.5 MByte EXTRA. Auch jeder Fensterswitch fügt dem Programm nochmal 4096 Bytes hinzu. Obwohl, nix, rein gar nix gerendert wird.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was renderst du denn? Wenn du gar nichts renderst würde ich einen Treiberfehler auch nicht ausschließen. Vielleicht haben die Treiberschreiber (;)) diesen Sonderfall nicht beachtet.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Ah, natürlich... dort kann ich jetzt das Gleiche beobachten... wobei mich überkommt bei diesem Code das Gruseln.
Von API-Code bei komplexen Projekten wie mit OpenGL halte ich persönlich nicht viel, ebensowenig von veraltetem Code, denn OpenGL 1.2 müsste ja eigentlich weder technisch noch headertechnisch auf dem neusten Stand sein. (Oder liege ich da falsch?)
Interessanterweise krieg ich beim Beenden Fehlermeldungen von der SDL.dll. Irgendwie gibt es zwar FPC-Compilerswitches, aber Lazarus weigert sich auf Anhieb zu kompilieren. Wenn man allerdings die Fehlerchen ausmerzt, scheint es das gleiche Problem zu haben.
Also schätz ich mal, entweder liegt irgendwo im API-Code der Hund begraben oder die Ursache liegt bei/in der SDL. Ggf. sollten sich das mal Leute anschauen, die diesen Code produziert haben.
@Flash: Treiberfehler würde ich ausschließen, wenn ich bei meinen VCL-non-SDL-Projekten sowas trotz "Nichtrenderns" nicht beobachten kann.
Das stimmt, der SDL Fehler kommt nur bei den original OpenGL Header von Boland. Passt man aber das Tempelte an die aktuellen Header (vom 6.12.2005) an, verschwindet zwar der SDL Fehler beim Beenden, aber die Sache mit dem Speicher bleibt. Auch bei einem VCL Programm konnte ich dies beoachten wenn man nix, oder nur ein paar Polygone rendert.
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.