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? Я не мог найти решение всего этого больше года! Заранее спасибо!

0 ответов

Другие вопросы по тегам