Opengl FPS

0

Gdy ładuje scenę 3D zwiększam zmienną FPS o jeden i chce ją (np:) po trzech sekundach wyświetlić.
Tą funkcją wyświetlam:

void DrawString( int x, int y, char *tablica )
{

    //kolor tekstu
    glColor3f( 0.0, 1.0, 0.0 );

    // położenie napisu
    glRasterPos2i( x, y );
   
    // wyświetlenie napisu
    int len = strlen( tablica );
    for( int i = 0; i < len; i++ )
         glutBitmapCharacter( GLUT_BITMAP_9_BY_15, tablica[ i ] );
   
}

A tą liczę czas:

int Time(int second)
{	
clock_t czas = clock()/1000;

   if(czas >= second)
   {
   return 1;
   }
}

Problem w tym, że zmienna FPS jest typu integer a funkcja do wyświetlania przyjmuje wartość char.

0

To będzie mniej więcej coś takiego:

std::stringstream ss(FPS);
std::string fpsString = ss.str();
char * tab = new char[fpsString.length()];
for(int i = 0; i < fpsString.length(); i++) {
tab[i] = fpsString[i];
}

Nie zapomnij dodać nagłówka <sstream>
Prościej by to można zrobić za pomocą funkcji itoa ale ona niestandardowa. W moim przykładzie mamy pewność ,że ten kod zawsze będzie działać

0

Pytanie, czy funkcja może zwracać tablicę ???

0

Tak funkcja może zwracać tablicę ale lepiej zrobić to na std::vector. Zwykłą tablicę stanowczo odradzam bo jak byś stworzył ją we funckji na stercie i zwrócił wskaźnik do niej to mogło by dojść do wycieków pamięci(mógłbyś zapomnieć ,że ten wskaźnik pokazuje akurat na tą funckję stworzoną w tablicy)

0

ss.str() - Co to robi ???

A i z jakiej biblioteki to jest masz jakiś kurs ???

0

Może zainteresuje cię inny sposób liczenia fps, ja z niego korzystam.
zmienne:

float fTime, fNewTime, dt;
float fFPS, fFPSTime;

Przed pętla:

    fTime = GetSecs();
    fFPSTime= 0.0f;
    uFrames = 0;
    msg.message = WM_NULL;

na początku pętli:

            
    fNewTime = GetSecs();
    dt = fNewTime - fTime;
    fTime = fNewTime;

na koncu pętli:

            ++uFrames;
            fFPSTime += dt;
            if (fFPSTime >= 1.0f)   // czy mniej niz sekunda?
            {
                // tak - aktualizacja FPS i zaczynamy liczyc klatki od poczatku
                fFPS = uFrames / fFPSTime;
                uFrames = 0;
                fFPSTime = 0.0f;
            }

wlasciwa ilosc fps jest w fFPS (float)

0

To jest funkcja licząca FPS:

char FPS(int iklatek, int time)
{
stringstream ss(FPS);
string FPString = ss.str();
char * board = new char[FPString.length()];
for(int i = 0; i < FPString.length(); i++) {
board[i] = FPString[i];
if(Time(time) == 1) DrawString(100, 100, board);
}

Jednak gdy próbuje skompilować kod to mam następujące błędy.

main.cpp(13): warning C4018: '<' : signed/unsigned mismatch 
main.cpp(15): error C2664: 'DrawString' : cannot convert parameter 3 from 'char' to 'char *' // <-jak to zrobić
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
error C2601: 'Display' : local function definitions are illegal
main.cpp(9): this line contains a '{' which has not yet been matched // cala masa błędów z klamrami nie wiem czemu 
C2601: 'Reshape' : local function definitions are illegal
main.cpp(9): this line contains a '{' which has not yet been matched
 error C2601: 'Keyboard' : local function definitions are illegal
main.cpp(9): this line contains a '{' which has not yet been matched
 error C2601: 'SpecialKeys' : local function definitions are illegal
main.cpp(9): this line contains a '{' which has not yet been matched
 error C2601: 'Menu' : local function definitions are illegal
main.cpp(9): this line contains a '{' which has not yet been matched
 error C2601: 'main' : local function definitions are illegal
main.cpp(9): this line contains a '{' which has not yet been matched
 fatal error C1075: end of file found before the left brace '{' at main.cpp(9)' was matched

A jeśli chodzi o ten twój sposób to go zaraz wypróbuje.

Na początku/końcu pętli

  • to miałbym kod umieścić w głównej funkcji czy funkcji rysującej scenę 3D ???
fFPSTime = 0.0f;

Dlaczego zmienna fFPSTime ma wartość 0.0f ???

0

Pisząc pętla mam na myśli pętle rysowania wszystkiego czyli pojedyńczej klatki + komunikaty bo to też troszku może wpłynąc na fps'y.
dt zawiera czas rysowania 1 klatki, po narysowaniu dodawany jest do fFPSTime jesli fFPSTime >= 1 sekunda to fFPS jest uaktualniany na ilosc klatek narysowanych zanim fFPSTime osiągneło więcej lub równo 1 sekundę podzielone przez dokładny czas z fFPSTime (nie zawsze 1 sekunda) daje to (podobno) najdokładniejsze obliczenie FPS.

0

Aha, ale ta wartość ( np: w if (fFPSTime >= 1.0f) ) - 1.0f - może tak być (pytam bo nigdy się z tym nie spotkałem) /

A odnośnie tych błędów ma ktoś jakiś pomysł ???

0

Float (takiego typu jest ta zmienna) przechowuje liczby zmiennoprzecinkowe i zamiast pisać 1 lub 1.0 pisze się 1f lub 1.0f , co do błędów ja do tej funkcji DrawString w 3 argumencie dałbym string w ten sposób DrawString(100,100,fpsString.c_str()); powinno zadziałać na klamry i '<' nie mam pomysłu.
Co do mojego sposobu to możesz zapisać fFPS do int'a w ten sposób (mając wcześniej zdeklarowana zmienna F typu int) F=int(fFPS); (ten sposób ucina wszystko co jest po kropce ale tutaj będą tylko liczby całkowite).

0

Dlaczego funkcja nie działa:

int FPS(int FPS, int time)
{
stringstream ss(FPS);
string FPString = ss.str();
char * board = new char[FPString.length()];
for( unsigned int i = 0; i < FPString.length(); i++)
   {
   board[i] = FPString[i];
   }
if(Time(time) == 1) DrawString(100, 100, board);
}

Resztę problemów rozwiązałem.

0

Co to znaczy "nie działa"?

1 użytkowników online, w tym zalogowanych: 0, gości: 1