Android游戏循环延迟随着时间的推移而急剧增加

时间:2017-10-02 00:03:07

标签: java android canvas surfaceview

我正在使用SurfaceView for android制作这个简单的2D画布游戏,我的游戏循环遇到了这个问题:随着时间的推移,fps会大大降低。我在本文中找到了游戏循环的设计:deWiTTERS Game Loop

GamePanel.java

package jacobmahoney.guardianofearth;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback {

    private MainThread thread;
    private SpaceshipObject spaceship;
    private LeftCircle leftCircle;
    private RightCircle rightCircle;
    private int screenWidth;
    private int screenHeight;

    public GamePanel(Context context) {

        super(context);
        getHolder().addCallback(this);
        thread = new MainThread(getHolder(), this);
        setFocusable(true);
        getScreenSize(context);
        spaceship = new SpaceshipObject(screenWidth, screenHeight);
        leftCircle = new LeftCircle(screenWidth, screenHeight);
        rightCircle = new RightCircle(screenWidth, screenHeight);

    }

    public void getScreenSize(Context context) {

        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getRealSize(size);
        screenWidth = size.x;
        screenHeight = size.y;

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread = new MainThread(getHolder(), this);
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        while (retry) {
            try {
                thread.setRunning(false);
                thread.join();
            } catch(Exception e) {
                e.printStackTrace();
            }
            retry = false;
        }
    }

    public void update() {
        rightCircle.update();
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        canvas.drawColor(Color.BLUE);
        spaceship.draw(canvas);
        leftCircle.draw(canvas);
        rightCircle.draw(canvas);
    }

}


MainThread.java

package jacobmahoney.guardianofearth;

import android.graphics.Canvas;
import android.util.Log;
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;
    }

    @Override
    public void run() {

        int TICKS_PER_SECOND = 50;
        int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
        int MAX_FRAMESKIP = 10;

        long next_game_tick = System.currentTimeMillis();
        int loops;

        long prev = System.currentTimeMillis();

        while (running) {

            Log.d("MainThread", "" + (System.currentTimeMillis() - prev)); // this value drastically increases over time
            prev = System.currentTimeMillis();

            loops = 0;

            while (System.currentTimeMillis() > next_game_tick && loops < MAX_FRAMESKIP) {
                this.gamePanel.update();
                next_game_tick += SKIP_TICKS;
                loops++;
            }

            canvas = this.surfaceHolder.lockCanvas();
            this.gamePanel.draw(canvas);
            surfaceHolder.unlockCanvasAndPost(canvas);

        }

    }

}


非常感谢任何帮助,谢谢!


修改
在评论了GamePanel.java中游戏对象的所有实例:leftCircle,rightCircle和spaceship 完全之后,我没有遇到随着时间的推移游戏变得越来越迟钝的问题,我猜猜很明显。然后,当我把太空船游戏对象放回到混合中时,随着时间的推移游戏仍然变得越来越滞后,但是比我将所有三个游戏对象绘制到画布时的速度更小。

我完全被难倒了,我真的不知道是什么原因引起了这个......任何想法?


EDIT2:
除去


EDIT3:
找出问题所在。这是我用来为每个对象绘制路径的代码的问题。我忘记在用于绘制路径的代码之前和之后放置 path.reset() path.close()。我也删除了我的edit2,因为我在沮丧的情况下发表评论,这是无根据的。

0 个答案:

没有答案