Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » Denkfehler fps?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.12.2004, 21:04 Uhr
CaesarCortezz
minderer Student


Hi Leutz,
ich habe mich nun in OpenGL ein wenig durchgefuselt und wollte nun eine fps-Anzeige einfügen.
Ich habe also in der Draw-Funktion eine Schriftausgabe (Bitmap-Fonts) die pro Szene einen counter um 1 erhöht

Code:
glPrint("FPS: %1.2f", fps);


fps is int (will ja nur ganze)
ich teile also noch nicht in fps auf...
Der Zähler ist allerdings viel zu langsam d.h ich bezweifle dass es auf 60fps (wie ja eigentlich üblich) kommt...
habe ich jetzt einen Denkfehler in Bezug auf fps (wie oft die Draw-Fkt aufgerufen wird) oder woran liegts?
PS: die sek habe ich noch nicht hinbekommen, wie macht man das?
Thx Caesar
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.12.2004, 21:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja ich mach es immer so:

ein Thread mit folgender funktion: (abbildung ähnlich )


C++:
funktion()
{
   while(true)
   {
      fps = fpsc;
      fpsc = 0;
      Sleep(1000); // 1 Sekunde schlafen
   }
}



beim Zeichnen wird dann immer pro "Runde" fpsc um 1 erhöht.

Ausgeben tust du dann fps. Das kommt dann eigentlich immer hin.


C++:
while(true) // oder was uach immer ;)
{
   fpsc++;
   // Zeichne was
   glPrint("%d",fps);
}




Bearbeitung:

Fehler korrigiert, muss natürlich Sleep(1000) heißen, ich verwechsel das immer ...


--
class God : public ChuckNorris { };

Dieser Post wurde am 09.12.2004 um 13:31 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.12.2004, 21:32 Uhr
CaesarCortezz
minderer Student


wenn ich das richtig verstanden habe finde ich doch jetzt aber nicht die fps raus, da sich ja meine "runden" jeweils um 1 sekunde verlängern oder? das ziel ist doch die runden pro sekunde auszurechnen...
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2004, 13:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nein, du musst FPS Berechnung und Zeichnen in zwei unterschiedlichen Timern/Threads machen, der erste Timer/Thread zeichnet und zählt deine fps-berechnungsvariable hoch, der 2te timer setzt deine fps-variable auf die berechnung und setzt die berechnung danach auf 0 und wartet wieder eine sekunde. dadurch kriegst du immer in sekundenabständen die fps (frames per second). Ansonsten weißt du ja nicht Wann eine Sekunde um ist.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.12.2004, 17:56 Uhr
stephanw
localhorst


Wenn Du ohne Threads arbeiten willst, kannst Du auch das machen:
- Du nimmst eine Referenzzeit und setzt einen Counter auf 0
- bei jedem Renderingschritt den Counter hochzählen
- jedes 20. Mal (oder auch jedes 30. Mal, ist egal) nimmst Du die Zeit und rechnest aus der Differenz und dem Counter die FPS aus. Dann setzt Du den Counter wieder auf 0 und nimmst eine neue Referenzzeit, um bei der nächsten Zeitmessung wieder eine Differenzzeit zu bekommen.

Dazu brauchst Du die Funktion time () und irgendwas zur Ausgabe (Console im einfachsten Fall).
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.12.2004, 17:57 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


jo im grunde spart man sich durch den thread die zeitberechnung, da diese ja auch performance kostet, das kann schon 1 bis 2 fps ausmachen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.12.2004, 18:21 Uhr
stephanw
localhorst


Meinst Du, soviel ? Mir wäre es Wurst, ob das nun 55 oder 57 FPS sind. Und ob es 10 oder 12 sind ist auch egal, beides nicht akzeptabel
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.12.2004, 19:53 Uhr
CaesarCortezz
minderer Student


öhm was ist ein thread? ich meine ich bin jetzt nach Flo's Methode vorgegangen weil ich keine Ahnung von time() habe
Mir ist immer noch nicht ganz klar wie ich nun auf die fps komme... muss ich diese funktion nicht aufrufen? und wenn ich dies mache wartet er doch eine sek oder nicht?
*verwirrt sei*

MfG Caesar
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.12.2004, 22:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Wie gehst du vor in deiner Anwendung? also das mit dem Zeichnen, kopier mir mal den code "um" die Zeichenfunktionen rum, also z.b deine WinMain/main und kürz alle unnötigen Zeichenfunktionen raus
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.12.2004, 11:03 Uhr
CaesarCortezz
minderer Student


uff ok:


C++:
// hier stand mal Standard Zeug

GLuint    base;
float fps;
LRESULT    CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
GLvoid BuildFont(GLvoid)
{
    HFONT    font;
    HFONT    oldfont;
    base=glGenLists(96);
    font = CreateFont(    -24,
                        0,
                        0,
                        0,
                        FW_BOLD,
                        false,
                        false,
                        false,
                        ANSI_CHARSET,
                        OUT_TT_PRECIS,
                        CLIP_DEFAULT_PRECIS,
                        ANTIALIASED_QUALITY,
                        FF_DONTCARE|DEFAULT_PITCH,
                        "Courier New");
    oldfont = (HFONT)SelectObject(hDC,font);
    wglUseFontBitmaps(hDC,32,96,base);
    SelectObject(hDC,oldfont);
    DeleteObject(font);
}
GLvoid KillFont(GLvoid)
{
    glDeleteLists(base,96);
}
GLvoid glPrint(const char *fmt, ...)
{
    char    text[256];
    va_list    ap;
    if (fmt == NULL)
        return;
    va_start(ap, fmt);
    vsprintf(text, fmt, ap);
    va_end(ap);
    glPushAttrib(GL_LIST_BIT);
    glListBase(base - 32);
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
    glPopAttrib();
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{
    if (height==0)
    {
        height=1;
    }
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
int InitGL(GLvoid)
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    BuildFont();
    return TRUE;
}


int DrawGLScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-6.0f);
    glColor3f(1.3f,1.3f,0.0f);
    fps+=1;
    glRasterPos2f(-0.5f,0.0f);
    glPrint("Frames: %1.0f", fps);
    return TRUE;
}

// und danach kommt das Fenster-Zeug (Standard NeHe) alles unwichtig bis auf killfont und die tastatureingaben usw...



so geschafft
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: