Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 02:57

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: winzige Frameleistung
BeitragVerfasst: Mo Mär 14, 2005 17:35 
Offline
DGL Member

Registriert: Di Mär 08, 2005 12:00
Beiträge: 8
Hallo,

Ich hab wieder mal ein problem und konnte diesmal nichst per Suche im Forum hier dazu finden.

Ich habe eine kleine 3D Demo, bestehen aus einem Würfel mit Textur der sich dreht, in geschrieben. Das heißt es werden 6 texturierte Quads gerendert.

Bei meinem PC läuft dies mit ca 1500 FPS. System:
Athlon xp 1800
Radeon 9700 Pro
512 MB DDR Ram

Dann hatte ich es auf einem PC Probiert mit folgender Hardware:
Athlon 950
GF 4 MX 460
512 MB SD Ram

Das Problem ist. dass die FPS enorm auf nur noch ca. 90 eingebrochen sind. Was ja eigentlich nicht sein kann bei diesem mini Programm, da ja auch relativ neue 3D Games auf einer MX 460 funktionieren (Generals usw.)

Dann hatte ich es noch auf einem Rechner mit einer Riva TNT 2 M64 laufen und hatte nur noch 20FPS!!!!
Dabei konnte diese Karte auch spiele wie Black and White problemlos darstellen.

Meine Frage also: Was mache ich falsch?????????
Bei DX hab ich mal gehört gibt es eine art Exklusive Modus. Gibst das bei OGL auch und hilft mir dass???
Das die Geschwindigkeit normal ist sollen kann ja unmöhlich sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 17:45 
Offline
DGL Member

Registriert: Di Mär 08, 2005 12:00
Beiträge: 8
ok, das mit den 90 FPS habe ich gerade gelöst, denn VSync war an was natürlich enorm bremste.

Aber dass auf der TNT2 nur 20 FPS sind kann ich mir nicht mit VSyny erklären (soweit bremst die ja garnicht runter). Das kann ich auch leider derzeit nicht testen, da deis ein Schulrechner war und ich da erst morgen wieder drann komme.

Vielleicht könnt ihr mir bei diesm Problem weiter helfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 17:47 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
prüfe mit glGetError(s?), ob OpenGl fehler meldet. Wenn ja, dann musst du nur noch herausfinden, an welcher stelle - solche Fehler bremsen immer massiv herunter, also probiere das erstmal aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Die Riva TNT 2 M64 war eine sehr reduzierte Karte und ich weiß noch aus eigener Erfahrung, dass die um einiges langsamer als eine normale TNT 2 und ich glaube sogar auch teilweise langsamer als die Voodoo Banshee war. Texturegrößen von über 256 gingen, waren aber extrem ruckelig. Selbst Q3 lief damit im Gegesatz zur Voodoo Banshee, die ja auch nicht wirklich Spitze war, nicht immer flüssig. Also die M64 kann man nicht als Maßstab benutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 20:36 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Zitat:
Dann hatte ich es noch auf einem Rechner mit einer Riva TNT 2 M64 laufen und hatte nur noch 20FPS!!!!
Dabei konnte diese Karte auch spiele wie Black and White problemlos darstellen.

Black and White auf einer Riva TNT 2 M64??? Problemlos mag ja sein, aber konnte man das dann noch spielen, oder war das mehr eine Diashow? ;)
Allerdings sind, selbst für eine Riva TNT 2, 20 FPS doch ein bisschen wenig...

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 20:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Vielleicht liegts einfach ein ein paar Sachen, die Standardmäßig aktiviert sind, zB irgendwelche Extensions. Außerdem könnte es, wie Lars schon angedeutet hat, an der Texturgröße liegen.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 14, 2005 20:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
Zitat:
Black and White auf einer Riva TNT 2 M64??? Problemlos mag ja sein, aber konnte man das dann noch spielen, oder war das mehr eine Diashow? Wink


also ich konnte auf meinem alten p3 600mhz mit Riva TNT2 M64 Black&White durchaus noch leicht ruckelnd, wengistens anfangs im Spiel, irgendwann wurde dass dann doch etwas stärker.[/quote]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 18:34 
Offline
DGL Member

Registriert: Di Mär 08, 2005 12:00
Beiträge: 8
ok danke, für die antworten.
Das eine Problem hab ich ja wie schon gesagt mit Vsync abschalten schon gelöst. Jedoch läuft es auf den Schulrechner immernoch recht langsam. Ich habe mal bei mir im Taskmanager die Systemnutzung angesehen und bemerkt, dass mein kleines Programm, mit einer 4kb Tetxur bereits 8MB Speicher benötig!?!?!?

Kann das damit etwas zu tun haben oder ist das normal?

Ich hab noch ein zweites Prog das mit einer großen Textur arbeitet die 1MB groß ist (Ein Planet). Dieses benötigt ca 70MB Ram und startet auf den Schulrechner nichteinmal ;-).

Ach ja, das mit glgeterrors hab ich probiert, hab aber nichts gefunden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 22:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
1.Texturen sind im Normalfall im Speicher der Grafikkarte -> verbrauchen überhaupt keinen Arbeitsspeicher. Ansonsten kann es durchaus vorkommen, das Texturen viel Platz wegnehmen, da ja meistens auch Mipmaps gespeichert werden.

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 00:01 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmmm...Der speicherplatz kommt vielleicht von Klassen die du erzeugst und die z.B. riesige Felder beinhalten. 70MB entsprechen z.B einem 32Bit Bitmap mit 17920 Pixel (256*70).

@ Lossy: Die Instanzen in deinem Texturloader beinhalten doch auch die Texturdaten oder? Die liegen dann doch auch im RAM oder? Die müssten also immer im RAM liegen (und u.U. auch auf der GraKa), oder?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 00:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
Zitat:
1.Texturen sind im Normalfall im Speicher der Grafikkarte -> verbrauchen überhaupt keinen Arbeitsspeicher. Ansonsten kann es durchaus vorkommen, das Texturen viel Platz wegnehmen, da ja meistens auch Mipmaps gespeichert werden.


verbrauchen denn mipmaps so viel Speicher? vonner größe her müsste das mit mipmaps ja ~dem 1,3-fachen des orginalspeicherverbrauchs beötigen, da würde ich ja meinen dass das im regelfall eher kaum auffällt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 06:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
@Flash: Nop. Daran habe ich natürlich auch gedacht. ;-) Das Normalverhalten ist so, dass nach dem Generieren die Texturdaten wieder frei gegeben werden. Aber man kann es natürlich auch einstellen, dass man sie nicht löschen möchte. Bei der glBMP liegen die Daten immer im Speicher.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 09:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Noch was zum Speicherverbrauch. Eine leere Delphianwendung benutzt schon mal eben 2,5 MB Speicher. Zu mindest bei mir. Also 8MB ist da durchaus noch vollkommen legitim. Je nachdem was du tust kann es auch sein, dass Windows für dich Speicher mit anlegt. Wenn ich in meinem einen Programm einen Windows Öffnendialog aufmache, dann springt der Speicherverbrauch von 5 auf 10 MB und die Threadanzahl von 1 auf 6 hoch. Wenn ich zusätzlich noch ein OpenGL Fenster aufmache, was noch diverse anderen Sachen beinhält, dann verbraucht es mal eben 18 MB. Aber 70 MB. Finde ich ein wenig viel. Ich weiß ja auch nicht genau was du da noch machst.

Zu deinem Geschwindigkeitsproblem können wir dir sonst nicht weiter helfen außer du zeigst uns mal ein bisschen Code. Ich tippe nämlich mal darauf, dass du beim Rendern etwas gemacht hast worauf die M64 ein wenig empfindlicher reagiert als die großen Karten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 18:44 
Offline
DGL Member

Registriert: Di Mär 08, 2005 12:00
Beiträge: 8
ok dann gebe ich hier mal den Code für das kleine Würfelprogramm:

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5. //******************************************************************************
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglopengl, glbitmap, AppEvnts, gl3Ds, ExtCtrls;
  9. //******************************************************************************
  10. type
  11.   TOpenGL = class(TForm)
  12.     ApplicationEvents1: TApplicationEvents;
  13.     Timer1: TTimer;
  14.     Timer2: TTimer;
  15.     procedure FormCreate(Sender: TObject);
  16.     procedure InitGL;
  17.     procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  18.     procedure Timer1Timer(Sender: TObject);
  19.     procedure Timer2Timer(Sender: TObject);
  20.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  21.       Shift: TShiftState);
  22.   private
  23.     { Private-Deklarationen }
  24.   public
  25.     { Public-Deklarationen }
  26.   end;
  27.  
  28. procedure Render;
  29. procedure SetDCPixelFormat(Handle: HDC);
  30. //******************************************************************************
  31. var
  32.   OpenGL: TOpenGL;
  33.   h_DC: hDC;
  34.   hRC: HGLRC;
  35.   MyTex: glUint;
  36.   rl, ht: real;
  37.   Framerate: integer;
  38.   RotateX: Single;
  39. //******************************************************************************
  40. implementation
  41.  
  42. {$R *.dfm}
  43. //******************************************************************************
  44. procedure TOpenGL.FormCreate(Sender: TObject);
  45. begin
  46. // OpenGL-Funtionen initialisieren
  47. InitOpenGL;
  48. // Gerätekontext holen
  49. h_DC := GetDC(Handle);
  50. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  51. hRC := CreateRenderingContext(h_DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  52. // Erstellten Renderkontext aktivieren
  53. ActivateRenderingContext(h_DC, hRC);
  54.  
  55. SetDCPixelFormat(h_DC);
  56.  
  57. InitGL;
  58.  
  59.   rl := 0;
  60.   ht := 0;
  61.   framerate := 0;
  62.   LoadTexture('mauer.jpg', MyTex, False);
  63. end;
  64. //******************************************************************************
  65. procedure TOpenGL.InitGL;
  66. begin
  67.   glClearColor(0,0,0,0);
  68.   glClearDepth(1);
  69.   glDepthFunc(GL_LESS);
  70.   glShadeModel(GL_SMOOTH);
  71.   glEnable(GL_DEPTH_TEST);
  72.  
  73.   glViewport(0,0,width,height);
  74.   glMatrixMode(GL_PROJECTION);
  75.   glLoadIdentity;
  76.   gluPerspective(45,Width/Height,0.1,100);
  77.   glMatrixMode(GL_MODELVIEW);
  78.  
  79. end;
  80. //******************************************************************************
  81. procedure SetDCPixelFormat(Handle: HDC);
  82. var
  83.   nPixelFormat: TGLUint;
  84. const
  85.   pfd: PIXELFORMATDESCRIPTOR = (
  86.       nSize: sizeof( PIXELFORMATDESCRIPTOR );
  87.       nVersion: 1;
  88.       dwFlags: PFD_DRAW_TO_WINDOW
  89.       or PFD_SUPPORT_OPENGL
  90.       or PFD_DOUBLEBUFFER;
  91.       iPixelType: PFD_TYPE_RGBA;
  92.       cColorBits: 16;
  93.       cRedBits: 0;
  94.       cRedShift: 0;
  95.       cGreenBits: 0;
  96.       cBlueBits: 0;
  97.       cBlueShift: 0;
  98.       cAlphaBits: 0;
  99.       cAlphaShift: 0;
  100.       cAccumBits: 0;
  101.       cAccumRedBits: 0;
  102.       cAccumGreenBits: 0;
  103.       cAccumBlueBits: 0;
  104.       cAccumAlphaBits: 0;
  105.       cDepthBits: 16;
  106.       cStencilBits: 0;
  107.       cAuxBuffers: 0;
  108.       iLayerType: PFD_MAIN_PLANE;
  109.       bReserved: 0;
  110.       dwLayerMask: 0;
  111.       dwVisibleMask: 0;
  112.       dwDamageMask: 0
  113.   );
  114. begin
  115.   nPixelFormat:=ChoosePixelFormat(h_DC, @pfd);
  116.   SetPixelFormat(h_DC,nPixelFormat,@pfd);
  117. end;
  118. //******************************************************************************
  119. procedure Render;
  120. var big: real;
  121. begin
  122.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  123.   glLoadIdentity;
  124.   //Hier wird später die Scene gezeichnet.
  125.  
  126.  
  127.   glTranslatef(rl,ht,-10);
  128.   glscalef(1,1,1);
  129.  
  130.  
  131.   big := 1;
  132.  
  133.   glRotatef(RotateX,0,1,0);
  134.   glEnable(GL_TEXTURE_2D);
  135.   glBindTexture(GL_TEXTURE_2D, MyTex);
  136.  
  137.   glcolor3f(1,1,1);
  138.  
  139.  
  140.   glBegin(GL_QUADS);
  141.   //  glColor3f(1,0,0);  //Rot
  142.     glTexCoord2f(1,0); glVertex3f(big,-big,big); //ru
  143.     glTexCoord2f(1,1); glVertex3f(big,big,big);  //ro
  144.     glTexCoord2f(0,1); glVertex3f(-big,big,big); //lo
  145.     glTexCoord2f(0,0); glVertex3f(-big,-big,big);//lu
  146.   glEnd;
  147.  
  148.   glBegin(GL_QUADS);
  149.   //  glColor3f(0,0,1);  //Blau
  150.     glTexCoord2f(1,0); glVertex3f(big,-big,-big);
  151.     glTexCoord2f(1,1); glVertex3f(big,big,-big);
  152.     glTexCoord2f(0,1); glVertex3f(-big,big,-big);
  153.     glTexCoord2f(0,0); glVertex3f(-big,-big,-big);
  154.   glEnd;
  155.  
  156.   glBegin(GL_QUADS);
  157.   //  glColor3f(0,1,0);  //Grün
  158.     glTexCoord2f(1,0); glTexCoord2f(1,0); glVertex3f(big,-big,-big);
  159.     glTexCoord2f(1,1); glTexCoord2f(1,1); glVertex3f(big,big,-big);
  160.     glTexCoord2f(0,1); glTexCoord2f(0,1); glVertex3f(big,big,big);
  161.     glTexCoord2f(0,0); glTexCoord2f(0,0); glVertex3f(big,-big,big);
  162.   glEnd;
  163.  
  164.   glBegin(GL_QUADS);
  165.   //  glColor3f(1,1,0);  //Gelb
  166.     glTexCoord2f(1,0); glVertex3f(-big,-big,-big);
  167.     glTexCoord2f(1,1); glVertex3f(-big,big,-big);
  168.     glTexCoord2f(0,1); glVertex3f(-big,big,big);
  169.     glTexCoord2f(0,0); glVertex3f(-big,-big,big);
  170.   glEnd;
  171.  
  172.   glBegin(GL_QUADS);
  173.   //  glColor3f(1,1,1);  //Weiß
  174.     glTexCoord2f(1,0); glVertex3f(big,big,-big);
  175.     glTexCoord2f(1,1); glVertex3f(big,big,big);
  176.     glTexCoord2f(0,1); glVertex3f(-big,big,big);
  177.     glTexCoord2f(0,0); glVertex3f(-big,big,-big);
  178.   glEnd;
  179.  
  180.   glBegin(GL_QUADS);
  181.   //  glColor3f(1,1,1);  //Weiß
  182.     glTexCoord2f(1,0); glVertex3f(big,-big,-big);
  183.     glTexCoord2f(1,1); glVertex3f(big,-big,big);
  184.     glTexCoord2f(0,1); glVertex3f(-big,-big,big);
  185.     glTexCoord2f(0,0); glVertex3f(-big,-big,-big);
  186.   glEnd;
  187.  
  188.   inc(framerate);
  189.  
  190.   swapBuffers(h_DC);
  191. end;
  192. //******************************************************************************
  193. procedure TOpenGL.ApplicationEvents1Idle(Sender: TObject;
  194.   var Done: Boolean);
  195. begin
  196.   Render;
  197.   Done := false;
  198. end;
  199. //******************************************************************************
  200. procedure TOpenGL.Timer1Timer(Sender: TObject);
  201. begin
  202.   RotateX:=RotateX + 1;
  203.   if RotateX>360 then
  204.     RotateX:=RotateX - 360;
  205. end;
  206.  
  207. procedure TOpenGL.Timer2Timer(Sender: TObject);
  208. begin
  209.   Opengl.Caption := inttostr(framerate);
  210.   framerate := 0;
  211. end;
  212.  
  213. procedure TOpenGL.FormKeyDown(Sender: TObject; var Key: Word;
  214.   Shift: TShiftState);
  215. begin
  216.   if key = 37 then
  217.     rl := rl - 0.1;
  218.   if key = 39 then
  219.     rl := rl + 0.1;
  220.   if key = 38 then
  221.     ht := ht + 0.1;
  222.   if key = 40 then
  223.     ht := ht - 0.1;
  224. end;
  225.  
  226. end.
  227.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also so sieht das eigentlich recht okay aus. Das einzige was man beim Rendern nch anders machen könnte ist das glBegin und glEnd. Wenn du dich dabei auf ein glBegin am Anfang und auf ein glEnd am Ende beschränkst hast du ein ganz klein wenig overhead entfernt. Aber der ist definitiv sehr gerin bei 6 Flächen.

Etwas was ich vielleicht auch anders gemacht hätte sind die Timer. Du arbeitest ja auch mit dem Idle und die Timer sind ja lediglich auch nur Windowsmessages. Evtl könnte es sein, dass die auf dem M64 Rechner irgendwie dazwischenfunken und dafür sorgen, dass das Idle nicht häufig genug aufgerufen wird. Aber wenn ich ehrlich bin glaube ich das nicht wirklich.

Anderfalls ist es in der Tat so, dass die M64 langsam ist.

Wie groß ist eigentlich das Fenster? Evtl ist es ja zu groß für die Karte und es ist nur so langsam, weil die Füllrate das Nadelöhr darstellt. Aber auch das kann ich nicht ganz so glaube weil ich selber lang genug eine TNT2 hatte. Aber halt eine richtige.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]