Partage
  • Partager sur Facebook
  • Partager sur Twitter

Limitation de FPS fonctionnant aléatoirement

Winapi Opengl

    18 juin 2007 à 14:15:26

    Bonjour à tous,

    J'essaye dans une application WinAPI utilisant opengl de limiter les fps (de la même façon que Mateo avec la SDL). J'ai réussi mais les fps ne sont pas ce qu'il devrait être, par exemple avec un délai de 20 ms entre chaque rafraichissement, au lieu d'avoir 50 fps, je me retrouve avec 32 fps.

    Voici la fonction de rappel de mon application :
    LRESULT CALLBACK MyWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static World *MyWorld;
        static HDC MyDC;
        static HGLRC MyRC;
        static unsigned long LastRefresh = 0, CurrentTime = 0, Last5Second = 0;
        static int CurrentFPS = 0, NextFPS = 0;
        static float Facteur = 0;

        switch (message)
        {
            //Création
            case WM_CREATE:
                //Ouverture du fichier d'erreur
                EcrireErreur ("Debut de l'enregistrement des erreurs.\n");

                //Creation et initialisation des contextes
                if (!CreateAndSetupDC(hwnd, MyDC, MyRC))
                {
                    EcrireErreur ("Class FctRappel, WM_CREATE : échec de la fonction CreateAndSetupDC.\n");
                    exit(EXIT_FAILURE);
                }

                //Creation du monde :), c'est beau :o
                MyWorld = new World ();

                //Creation du rendu
                wglMakeCurrent(MyDC, MyRC);

                //Initialisation d'openGL
                MyWorld->InitOpenGL (MySharedData);

                //Chargement des media
                MyWorld->LoadMedia ();

                //Creation d'une entite de test
                MyWorld->AddEntity ("Test.obj");
            break;

            case WM_PAINT:
                CurrentTime = GetTickCount ();//Mise à jour du temps courant

                //Rafraichissement du monde si besoin est.
                if (CurrentTime - LastRefresh > 20)
                {
                    MyWorld->ReDrawWorld (MyDC);
                    MyWorld->MoveWorld (Facteur);
                    LastRefresh = CurrentTime;
                    NextFPS ++;
                }

                //Calcul des fps
                if (CurrentTime - Last5Second > 200)
                {
                    CurrentFPS = NextFPS * 5;//Nouveau fps
                    NextFPS = 0;//Mise à 0 des prochaine fps
                    Last5Second = CurrentTime;//Mise à jour de la seconde
                    Facteur = (float) 60 / CurrentFPS;//les fps de references sont 60
                }
            break;

            case WM_KEYDOWN:
                switch (wParam)
                {
                    case VK_UP://Fleche haut
                    break;
                    case VK_DOWN://Fleche bas
                    break;
                }
            break;

            //Destruction
            case WM_DESTROY:
                delete MyWorld;
                //Destruction des contextes
                wglMakeCurrent(NULL, NULL);
                if (MyRC)
                    wglDeleteContext(MyRC);
                ReleaseDC(hwnd,MyDC);
                EcrireErreur ("", true);//Ferme le fichier d'erreur
                PostQuitMessage (0);
            break;

            //Traitement par defaut
            default:
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
        return 0;
    }


    Et voici mon main :
    int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
                        LPSTR lpszArgument, int nFunsterStil)
    {
        //Variables
        MSG messages;
        MySharedData.g_hMyHinst = hThisInstance;

        //Recuperation de la resolution et des options
        if (!Initialisation (&MySharedData.iLargeur, &MySharedData.iHauteur))
        {
            ShellExecute(NULL, "open", "3dExplorer Option.exe", NULL, NULL, SW_SHOWNORMAL);
            exit(EXIT_SUCCESS);
        }

        //Création et enregistrement de la classe
        if (!RegisterClass())
        {
            EcrireErreur ("Class main, Aucun : échec de la fonction RegisterClass.\n");
            exit(EXIT_FAILURE);
        }

        //Création de la fenêtre principale
        MySharedData.g_hMyHwnd =  CreateWindowEx (0, "3dExplorer", "3dExplorer", WS_CAPTION| WS_SYSMENU| WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
        CW_USEDEFAULT, CW_USEDEFAULT, MySharedData.iLargeur, MySharedData.iHauteur, HWND_DESKTOP, NULL, hThisInstance, NULL);

        ShowWindow (MySharedData.g_hMyHwnd, nFunsterStil);

        //Récupération des messages
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        return messages.wParam;
    }


    Je pense que ma façon de gérer le rafraichissement d’opengl n’est pas bonne, mais tous les tuto que j'ai trouvés sur le net font à peu prés comme moi.

    EDIT :J'ai oublier de préciser que les rafraichissements s'effectuaient dans la méthode ReDrawWorld () :
    void World::ReDrawWorld (HDC &MyDC)
    {
        //Netoyage
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        //Placage de la camera
        gluLookAt (0, 0, 60, 0, 0, 0, 0, 1, 0);

        //Affichage de toutes les entité
        DrawAllEntity ();

        //Rafraichissement
        SwapBuffers(MyDC);
    }
    • Partager sur Facebook
    • Partager sur Twitter

    Limitation de FPS fonctionnant aléatoirement

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown