Android:低帧率

时间:2017-04-24 23:32:23

标签: java android frame-rate

我创建了一个包含7种不同迷你游戏的应用程序。其中一个迷你游戏总是运行良好,好吧,它总是有一些框架问题通常以6fps运行。我最近运行了这个游戏,并意识到帧速率现在几乎无法播放。我不知道是什么导致了这个问题,是否有人可以推荐修复以提高帧率?

游戏使用许多不同的类来创建,它是一个表面视图。在这里复制所有类将是很多代码,所以我将发布创建表面的类。

任何有关提高应用程序帧速率的帮助都会对您有所帮助。

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback
{
    public static final int WIDTH = 856;
    public static final int HEIGHT = 480;
    public static final int MOVESPEED = -5;
    private long missileStartTime;
    private MainThread thread;
    private Background bg;
private Player player;
private ArrayList<Missile> missiles;
private Random rand = new Random();
int score = 0;
private final Context context;

public GamePanel(Context context)
{
    super(context);
    this.context = context;

    //add the callback to the surfaceholder to intercept events
    getHolder().addCallback(this);

    thread = new MainThread(getHolder(), this);

    //make gamePanel focusable so it can handle events
    setFocusable(true);
}

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

@Override
public void surfaceDestroyed(SurfaceHolder holder){
    boolean retry = true;
    int counter = 0;
    while(retry && counter<1000)
    {
        counter++;
        try{thread.setRunning(false);
            thread.join();
            retry = false;

        }catch(InterruptedException e){e.printStackTrace();}

    }

}

@Override
public void surfaceCreated(SurfaceHolder holder){

    bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.nightskyresize));
    player = new Player(BitmapFactory.decodeResource(getResources(), R.drawable.pilot), 65, 25, 1);
    missiles = new ArrayList<Missile>();
    missileStartTime = System.nanoTime();



    //we can safely start the game loop
    thread.setRunning(true);
    thread.start();

}
@Override
public boolean onTouchEvent(MotionEvent event)
{
    if(event.getAction()==MotionEvent.ACTION_DOWN){
        if(!player.getPlaying())
        {
            player.setPlaying(true);
        }
        else
        {
            player.setUp(true);
        }
        return true;
    }
    if(event.getAction()==MotionEvent.ACTION_UP)
    {
        player.setUp(false);
        return true;
    }

    return super.onTouchEvent(event);
}

public void update()

{
    if(player.getPlaying()) {

        bg.update();
        player.update();

        //add missiles on timer
        long missileElapsed = (System.nanoTime()-missileStartTime)/10000000;
        if(missileElapsed >(2000 - player.getScore()/4)){

            System.out.println("making missile");
            //first missile always goes down the middle
            if(missiles.size()==0)
            {
                missiles.add(new Missile(BitmapFactory.decodeResource(getResources(),R.drawable.
                        missile),WIDTH + 10, HEIGHT/2, 45, 15, player.getScore(), 1));
            }
            else
            {

                missiles.add(new Missile(BitmapFactory.decodeResource(getResources(),R.drawable.missile),
                        WIDTH+10, (int)(rand.nextDouble()*(HEIGHT)),45,15, player.getScore(),1));
            }

            //reset timer
            missileStartTime = System.nanoTime();
        }
        //loop through every missile and check collision and remove
        for(int i = 0; i<missiles.size();i++)
        {
            //update missile
            missiles.get(i).update();

            if(collision(missiles.get(i),player))
            {
                Intent i1 = new Intent (context, main_menu.class);
                context.startActivity(i1);
                missiles.remove(i);
                player.setPlaying(false);
                break;
            }
            //remove missile if it is way off the screen
            if(missiles.get(i).getX()<-100)
            {
                score++;
                missiles.remove(i);
                break;


            }
        }


    }
    if(score == 100){

        Intent i1 = new Intent (context, main_menu.class);
        context.startActivity(i1);
    }


}
public boolean collision(GameObject a, GameObject b)
{
    if(Rect.intersects(a.getRectangle(),b.getRectangle()))
    {
        return true;
    }
    return false;
}
@Override
public void draw(Canvas canvas)
{
    final float scaleFactorX = getWidth()/(WIDTH*1.f);
    final float scaleFactorY = getHeight()/(HEIGHT*1.f);

    if(canvas!=null) {
        final int savedState = canvas.save();



        canvas.scale(scaleFactorX, scaleFactorY);
        bg.draw(canvas);
        player.draw(canvas);

        //draw missiles
        for(Missile m: missiles)
        {
            m.draw(canvas);
        }

        drawText(canvas);




        canvas.restoreToCount(savedState);
    }
}
public void drawText(Canvas canvas)
{
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(30);
    paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
    canvas.drawText("DISTANCE: " + (player.getScore()*3), 10, HEIGHT - 10, paint);


}


}

我还得到了日志来打印帧速率,这就是结果。

enter image description here

关于这个原因的任何想法? fps是0.0,通常会说6.0或7.0左右。

这是一个奇怪的问题,但是我有音乐的地方听起来有两个版本互相播放,比如应用程序正在运行它自己的两个实例。这有可能吗?

这是问题

enter image description here

0 个答案:

没有答案