Я создал свой игровой цикл через Surfaceview. Анимации в игре работают быстрее на мощных устройствах с высокой конфигурацией и медленнее на устройствах с низкой конфигурацией. Поэтому я попытался посчитать FPS, и если FPS высокий, то должна быть задержка, иначе задержки для myThreadSurfaceView.onDraw(c);
нет.
Вот мой код потока игрового цикла, который я использовал для расчета:
private long mLastTime;
/** Variables for the counter */
private int frameSamplesCollected = 0;
private int frameSampleTime = 0;
private int fps = 0;
@Override
public void run() {
while (myThreadRun) {
Canvas c = null;
try {
c = myThreadSurfaceHolder.lockCanvas(null);
synchronized (myThreadSurfaceHolder)
{
long now = System.currentTimeMillis();
if (mLastTime != 0) {
//Time difference between now and last time we were here
int time = (int) (now - mLastTime);
frameSampleTime += time;
frameSamplesCollected++;
//After 10 frames
if (frameSamplesCollected == 10)
{
//Update the fps variable
fps = (int) (10000 / frameSampleTime);
//Reset the sampletime + frames collected
frameSampleTime = 0;
frameSamplesCollected = 0;
}
}
mLastTime = now;
}
if(fps>25)
{
try {
myThreadSurfaceView.onDraw(c);
TimeUnit.MILLISECONDS.sleep(35);
//Thread.sleep(35);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
myThreadSurfaceView.onDraw(c);
}
}
finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
myThreadSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
Теперь этот код дает желаемый результат, так как я хочу, чтобы иногда FPS был одинаковым для высокой и низкой конфигурации. устройства. Я хочу, чтобы игра работала одинаково как на высоких, так и на низких настройках. устройства.
Итак, как я могу достичь своей цели? Есть ли лучший способ сделать это?