2014-02-20 5 views
0

У меня проблема с тем, что мой ограничитель кадров работает очень неточно. Я устанавливаю целевые кадры в секунду на 30, но получаю значения между 10FPS и 500FPS. Я думаю, что сделал большую ошибку, но я не могу ее найти. Это класс, который должен ограничить FPS:Android OpenGL ES: ограничение кадров в секунду

public class FrameLimiter { 

private long interval; 
private long startTime; 
private long endTime; 
private long timeForOneFrame; 

/** Limits an unlimited loop. 
* You should select a value above 25FPS! 
* @param FPS the target value of frames per second 
*/ 
public FrameLimiter(int FPS){ 
    interval = 1000/FPS; 
    startTime = System.currentTimeMillis(); 
} 

/** Calling this method stops the current thread until enough time elapsed to reach the target FPS. 
*/ 
public void limit(){ 
    endTime = System.currentTimeMillis(); 
    timeForOneFrame = endTime - startTime; 

    if (timeForOneFrame < interval) 
     try { 
      Thread.sleep(interval - timeForOneFrame); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    startTime = System.currentTimeMillis(); 
} 

/** Returns the current FPS measured against the time between two calls of limit(). 
* This method just works in combination with limit()! 
* @return the current FPS. 
*/ 
public int getFPS(){ 
    if(timeForOneFrame <= 0){ 
     return 0; 
    }else{ 
     return (int) (1000/timeForOneFrame); 
     } 
    } 
} 

Я использую мой класс так:

@Override 
public void onDrawFrame(GL10 gl) {    
    this.render(); 

    Log.d(toString(), String.valueOf(limiter.getFPS())+ "FPS"); 
    limiter.limit(); //has to be the last statment 
} 

Я был бы признателен за каждую помощь.

ответ

1
System.currentTimeMillis(); 

Эта функция очень неточны в Android (это разрывных) использовать вместо:

SystemClock.elapsedRealtime(); 

и

SystemClock.sleep(millis); //not need try block, instead of 

Thread.sleep(millis);//need try block 
0

Независимо от того, что у вас есть веская причина, я настоятельно рекомендую не использовать функцию sleep() в функции.

Я разработал много игр на Android, и они работают очень хорошо практически на всех устройствах Android.

Перейти сюда. Вектор направления * Дельта * Значение (которое должно перемещаться в течение 1 секунды)

Delta is (Tick - LastTick)/1000.f;

клещ мс

Смежные вопросы