Android - Блокировка Canvas занимает слишком много времени на некоторых кадрах
У меня есть нормальный игровой цикл в Android Studio, написанный на Java с потоками. Недавно я понял, что значение fps влияет на метод lockCanvas(). Например, если я устанавливаю значение fps в 60, lockCanvas() занимает 2,5 мс, но если я устанавливаю значение fps в 1000, тот же метод занимает более 10 мс. Переменная fps используется только для Thread.sleep (), чтобы поддерживать стабильный FPS. Еще одна вещь, которую я заметил, это то, что если я ничего не рисую на холсте или не сплю, то метод lockCanvas() занимает столько же времени, сколько один кадр за 60fps (16.67ms)
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? Я не мог найти решение всего этого больше года! Заранее спасибо!