Stałe FPS Android OpenGLES

Witaj programiści Androida,

Opracowuję prostą grę na Androida w Eclipse przy użyciu OpenGLES 1.0. Używam Samsunga Galaxy S2 Android (2.3) jako urządzenia do rozwoju.

Mam pytanie o dwurdzeniowy i stały współczynnik szybkości odtwarzania.

Zarządzałem więc tworzeniem GLSurfaceView i nadpisywaniem funkcji onDrawFrame (), w której wywołuję funkcję LogicUpdate (deltatime) i funkcję Render ().

Tak, na razie wszystko w jednym wątku.

Problem, który napotykam, to dwurdzeniowy. Jeśli wyłączę dwurdzeniowy przechodząc do ustawienia-> Oszczędzanie energii i sprawdzając oszczędzanie energii systemu, zdaję sobie sprawę, że renderowanie jest automatycznie blokowane przy 30 FPS. Ale jeśli włączę dwurdzeniowy odznaczając opcję Oszczędzanie energii systemu, widzę, że renderowanie jest zablokowane przy 60 FPS, ale telefon nagrzewa się i bardzo szybko rozładowuje baterię.

Pomysł polega na tym, aby moja gra działała z prędkością 30 klatek na sekundę, aby oszczędzić trochę baterii.

W tym celu używam kodu poniżej.

Zanim wykonam aktualizację logiczną, nazywam to spokojem kodu, pamiętaj, że wszystko to zostało wykonane w onDrawFrame ().

if( CONST_FPS > 0 && StartTime > 0 )
{           
    /////////////////////////////////////////////////////////////////
    // Get frame time
    ////////////////////////////////////////////////////////////////
    long endTime  = System.currentTimeMillis(); 
    long time     = endTime - StartTime;
    //              
    long wantedtime = 1000 / CONST_FPS;
    //
    long wait = 0;
    if( time < wantedtime )
    {
        wait = wantedtime - time;
        //                  
        Thread.sleep(wait);
    }
    else
    {
        //Time to big game will slow down
    }                           
}

Gdzie CONST_FPS = 30

I wtedy

StartTime = System.currentTimeMillis(); //

UpdateLogic(1.0 / CONST_FPS);
Render();

Rozgrywka przy 30 FPS jest bardzo płynna, głównie dlatego, że nie musi blokować FPS. ALE, próbując zablokować 60 klatek na sekundę do 30 klatek na sekundę, mam jąkanie. Zrobiłem kilka badań i odkryłem, że Thread.Sleep () nie jest precyzyjny. Czy to prawda? Co jeszcze mogę zrobić, aby gra była bardziej płynna, gdy blokujesz 60 klatek na sekundę do 30 klatek na sekundę.

Dziękuję za odpowiedź ...

questionAnswers(2)

yourAnswerToTheQuestion