Android - Блокировка Canvas занимает слишком много времени на некоторых кадрах - PullRequest
0 голосов
/ 20 ноября 2018

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

...