Android Canvas drawBitmap занимает слишком много времени на Android Oreo, в то время как он прекрасно работает на Android Lollipop - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу сделать нормальную игру с птичками и так будет выглядеть класс препятствий.Здесь в методе ConfigureNextFrame () я обновляю позиции препятствий и рисую с помощью обычного метода canvas.drawBitmap ().Для рисования препятствий на Android Oreo требуется около 20 мс, в то время как Android Lollipop работает плавно.Это время слишком длинное, потому что есть и другие вещи, которые можно рисовать, и я могу достичь только 15fps.Я использую обычный игровой цикл с SurfaceView и SurfaceHolder.Я также пробовал метод Drawable.draw (canvas), но результаты те же.

private final int obstacleframemove = Variables.esar * Variables.obstacleframemove;

private Bitmap obstacledrawableup;
private Bitmap obstacledrawabledown;
private float left;
private float utop;
private float dtop;
private float right;
private float ubottom;
private float dbottom;

public Flappy50Obstacle(int position, int part) {

    obstacledrawableup = Methods.GenerateScaledBitmap(ContextCompat.getDrawable(Variables.currentcontext, R.drawable.flappy50_up), 2f * Variables.easyscalea);
    obstacledrawabledown = Methods.GenerateScaledBitmap(ContextCompat.getDrawable(Variables.currentcontext, R.drawable.flappy50_down), 2f * Variables.easyscalea);

    left = (int) Variables.width;
    utop = position - obstacledrawableup.getHeight() - part;
    right = left + obstacledrawableup.getWidth();
    ubottom = utop + obstacledrawableup.getHeight();

    dtop = position + part;
    dbottom = dtop + obstacledrawabledown.getHeight();

}

public void ConfigureNextFrame(Canvas canvas) {

    if (Flappy50Panel.GetMoveBackgroundItems()) {

        left -= obstacleframemove;
        right -= obstacleframemove;

    }

    long x = System.currentTimeMillis();

    canvas.drawBitmap(obstacledrawableup, left, utop, null);
    canvas.drawBitmap(obstacledrawabledown, left, dtop, null);

    Log.d("TIMEINMILLIS", String.valueOf(System.currentTimeMillis() - x));

}

public Rect GetCoordinatesUp() {

    Rect r = new Rect();

    r.left = (int) left;
    r.top = (int) utop;
    r.right = (int) right;
    r.bottom = (int) ubottom;

    return r;

}

public Rect GetCoordinatesDown() {

    Rect r = new Rect();

    r.left = (int) left;
    r.top = (int) dtop;
    r.right = (int) right;
    r.bottom = (int) dbottom;

    return r;

}

}

...