У меня есть нормальный игровой цикл в Android Studio, написанный на Java с потоками.Недавно я понял, что значение fps влияет на метод lockCanvas () .Например, если я установлю значение fps на 60 lockCanvas () займет 2.5ms , но если я установлю значение fps на 1000 тот же метод занимает более 10мс .Переменная fps используется только для Thread.sleep () , чтобы поддерживать стабильный FPS.Еще одна вещь, которую я заметил, это то, что если я ничего не рисую на холсте или не сплю, то метод lockCanvas () занимает столько же времени, сколько один кадр за 60fps (16,67 мс)
private final int fps = 1000; // Usually it's 60.
private SurfaceHolder surfaceholder;
private Panel panel;
private boolean running;
private Canvas canvas;
public MainThread(SurfaceHolder surfaceholder, Panel panel) {
super();
this.surfaceholder = surfaceholder;
this.panel = panel;
}
public void Enable() {
running = true;
}
public void Disable() {
running = false;
}
@Override
public void run() {
long updatetime = 1000000000 / fps;
long starttime;
long processtime;
long waittime;
while (running) {
starttime = System.nanoTime();
canvas = null;
try {
synchronized (surfaceholder) {
// Takes about 10ms when the fps value is 1000
canvas = surfaceholder.lockCanvas();
// 7-8ms
panel.ConfigureNextFrame(canvas);
}
} catch (Exception ex) {
} finally {
if (canvas != null) {
// 0.5-1.5ms
surfaceholder.unlockCanvasAndPost(canvas);
}
}
processtime = System.nanoTime() - starttime;
waittime = updatetime - processtime;
try {
if (waittime > 0) {
this.sleep(waittime / 1000000, (int) (waittime % 1000000));
}
} catch (Exception ex) {
}
}
}
У меня есть еще один вопрос.Когда я рисую 32-битный PNG (загруженный как Растровое изображение ) на холсте, вместо этого требуется утроение 24 или 8-битный PNG .Почему такие странные вещи случаются в Java?Я не мог найти решение всего этого больше года! Заранее спасибо!