Низкий FPS на телефоне Huawei при запуске приложения для Android - PullRequest
0 голосов
/ 29 марта 2019

Некоторое время я создавал игру для Android на основе библиотеки холста. Я решил стать бесконечным бегуном. Я проверил это на нескольких устройствах.

На моем старом Sony M4 Aqua, а также на Huawei Y6 и Samsung S8 все выглядит нормально, но когда я тестировал его на Huawei P20 Lite, он загружал только заставку, а потом давил.

Я понял, что это проблема с настройкой ландшафтного режима, и мне пришлось поместить его в manifest.xml для работы. Сейчас он работает, но у него очень мало FPS. Я проверил и проблема была в фоновом классе, но только на этом телефоне.

package turtle.app;

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;

import java.io.IOException;
import java.io.InputStream;

public class Background {

    private Bitmap background, background2;
    private Rect backSrc, backDes, backSrc2;

    private int speed;

    public Background(String path, int speed){
        this.speed = speed;
        background = getBackground(path);
        backSrc = new Rect(0, 0, Constants.SCREEN_WIDTH, background.getHeight());
        backDes = new Rect(0, 0, Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT);
        background2 = Bitmap.createBitmap(background, background.getWidth() - Constants.SCREEN_WIDTH, 0, Constants.SCREEN_WIDTH, background.getHeight());
        backSrc2 = new Rect(Constants.SCREEN_WIDTH, 0, Constants.SCREEN_WIDTH * 2, background.getHeight());
    }

    private static Bitmap getBackground(String strName) {
        AssetManager assetManager = Constants.context.getAssets();
        InputStream istr;
        Bitmap bitmap = null;
        try {
            istr = assetManager.open(strName);
            bitmap = BitmapFactory.decodeStream(istr);
        } catch (IOException e) {
            return null;
        }
        return bitmap;
    }

    public void changeSpeed(int newSpeed){
        speed = newSpeed;
    }

    public void update() {

        backSrc.left += speed;
        backSrc.right += speed;
        backSrc2.left += speed;
        backSrc2.right += speed;

        if(backSrc.right >= background.getWidth()) {
            backSrc2.left = 0;
            backSrc2.right = Constants.SCREEN_WIDTH;
            backSrc.left = - Constants.SCREEN_WIDTH;
            backSrc.right = 0;
        }
    }

    public void draw(Canvas canvas) {
        canvas.drawBitmap(background, backSrc, backDes, null);
        canvas.drawBitmap(background2, backSrc2, backDes, null);
    }
}

А вот мой игровой цикл точно.

package turtle.app;

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class MainThread extends Thread {
    private SurfaceHolder surfaceHolder;
    private GamePanel gamePanel;
    private boolean running;
    public static Canvas canvas;

    public void setRunning(boolean running) {
        this.running = running;
    }

    public MainThread(SurfaceHolder surfaceHolder, GamePanel gamePanel) {
        super();
        this.surfaceHolder = surfaceHolder;
        this.gamePanel = gamePanel;
    }

    public void run() {
        long lastTime = System.nanoTime();
        double amountOfTicks = 100.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int frames = 0;
        while (running) {
            canvas = null;
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                this.gamePanel.update();
                delta--;
            }
            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized (surfaceHolder) {
                    this.gamePanel.draw(canvas);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (canvas != null) {
                    try {
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            frames++;
            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("FPS: " + frames);
                frames = 0;
            }
        }
    }
}

Это что-то в новых телефонах Huawei или я что-то не так сделал?

1 Ответ

0 голосов
/ 29 марта 2019

Это признак использования слишком большого количества ресурсов.Возможно, ваша игра не будет работать на устройствах с низким процессором.

Все еще есть надежда:

  • При разработке в Android Studio вы можете проверить, какие процессы работает на вашем процессоре.Чтобы сделать это, нажмите Profiler (или нажмите Cmd + Shift + A в Mac и введите Profile)

enter image description here

  • Добавитьсеанс вашего устройства:

enter image description here

  • Теперь ваше приложение работает.Нажмите на CPU и запишите временной интервал (скажем, 10 секунд), в котором ваше приложение испытывает трудности.

  • Остановите запись, и у вас будет что-то вроде этого:

enter image description here

Вы видите маленькие биты внизу?Это те функции, которые вызываются, например, когда вы обновляете список, вы устанавливаете какой-то текст, вы меняете цвет и так далее.Вы можете определить, что идет не так в вашем приложении, например, вы меняете текст, и это занимает 300 мс, если вы знаете, что это займет 5 мс или 6 мс.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...