Некоторое время я создавал игру для 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 или я что-то не так сделал?