2012-11-14 59 views
3

我一直在關注this教程。我一直在玩代碼,抽出東西,我不需要添加東西等,但是當我在模擬器中運行它時,塊會以非常緊張的動作移動。這就像我得到一個低FPS。對於運行應用程序的第一秒鐘左右,它會平穩地運行,然後在關閉之前重新編譯它時再運行約一秒鐘。任何想法如何使它始終保持平穩運行?爲什麼我的android應用程序如此緩慢?

MainActivity.java

package com.example.mobilecoursework; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Window; 

public class MainActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(new Blocks(this)); 
    } 
} 

blocks.java

package com.example.mobilecoursework; 

import java.util.ArrayList; 
import java.util.Random; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


class Blocks extends SurfaceView implements SurfaceHolder.Callback { 
    // 
    private BlockThread _thread; 
    //declare an array of the block sprites 
    private ArrayList<GraphicObject> _graphics = new ArrayList<GraphicObject>(); 


    public Blocks(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
     _thread = new BlockThread(getHolder(), this); 
     setFocusable(true); 
    } 



    public void DrawBlocks(){ 
     for (int i=0; i < 20; i++) 
     { 
      //create new random x and y position values 
      Random randX = new Random(); 
      int i1=randX.nextInt(getWidth()-0) + 0; 
      Random randY = new Random(); 
      int i2=randY.nextInt(getHeight()-0) + 0; 
      GraphicObject graphic = new GraphicObject(BitmapFactory.decodeResource(getResources(), R.drawable.block)); 
      graphic.getCoordinates().setX((int) i1 - graphic.getGraphic().getWidth()/2); 
      graphic.getCoordinates().setY((int) i2 - graphic.getGraphic().getWidth()/2); 
      _graphics.add(graphic); 
     } 
    } 

    public void updatePhysics() { 
     GraphicObject.Coordinates coord; 
     for (GraphicObject graphic : _graphics) { 
      //move blocks down 
      coord = graphic.getCoordinates(); 
      coord.setY(coord.getY() + 5);     
      // reset block 
      if (coord.getY() + graphic.getGraphic().getHeight() > getHeight()+10) { 
       coord.setY(-10); 
      } 
     } 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     Bitmap bitmap; 
     GraphicObject.Coordinates coords; 
     for (GraphicObject graphic : _graphics) { 
      bitmap = graphic.getGraphic(); 
      coords = graphic.getCoordinates(); 
      canvas.drawBitmap(bitmap, coords.getX(), coords.getY(), null); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     _thread.setRunning(true); 
     _thread.start(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // simply copied from sample application LunarLander: 
     // we have to tell thread to shut down & wait for it to finish, or else 
     // it might touch the Surface after we return and explode 
     boolean retry = true; 
     _thread.setRunning(false); 
     while (retry) { 
      try { 
       _thread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // we will try it again and again... 
      } 
     } 
    } 
} 

class BlockThread extends Thread { 
    private SurfaceHolder _surfaceHolder; 
    private Blocks _Blocks; 
    private boolean _run = false; 

    public BlockThread(SurfaceHolder surfaceHolder, Blocks blocks) { 
     _surfaceHolder = surfaceHolder; 
     _Blocks = blocks; 
    } 

    public void setRunning(boolean run) { 
     _run = run; 
    } 

    public SurfaceHolder getSurfaceHolder() { 
     return _surfaceHolder; 
    } 

    @Override 
    public void run() { 
     Canvas c; 
     _Blocks.DrawBlocks(); 

     while (_run) { 
      c = null; 
      try { 
       c = _surfaceHolder.lockCanvas(null); 
       synchronized (_surfaceHolder) { 
        _Blocks.updatePhysics(); 
        _Blocks.onDraw(c); 
       } 
      } finally { 
       // do this in a finally so that if an exception is thrown 
       // during the above, we don't leave the Surface in an 
       // inconsistent state 
       if (c != null) { 
        _surfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 
} 

class GraphicObject { 
    // 
    // Contains the coordinates of the graphic. 
    // 
    public class Coordinates { 
     private int _x = 100; 
     private int _y = 0; 

     public int getX() { 
      return _x + _bitmap.getWidth()/2; 
     } 

     public void setX(int value) { 
      _x = value - _bitmap.getWidth()/2; 
     } 

     public int getY() { 
      return _y + _bitmap.getHeight()/2; 
     } 

     public void setY(int value) { 
      _y = value - _bitmap.getHeight()/2; 
     } 

     public String toString() { 
      return "Coordinates: (" + _x + "/" + _y + ")"; 
     } 
    } 

    private Bitmap _bitmap; 
    private Coordinates _coordinates; 


    public GraphicObject(Bitmap bitmap) { 
     _bitmap = bitmap; 
     _coordinates = new Coordinates(); 

    } 

    public Bitmap getGraphic() { 
     return _bitmap; 
    } 



    public Coordinates getCoordinates() { 
     return _coordinates; 
    } 
} 
+6

您是否在真實設備上測試過? –

+2

[我看起來像上師嗎?](http://programmer.97things.oreilly.com/wiki/index.php/The_Guru_Myth) –

回答

6

模擬器是極其緩慢的,你的問題可能是原因。沒有什麼東西會跳出你的代碼,所以在你試圖讓它變得更流暢之前,先在真實的設備上嘗試一下。

+2

+1,000。永遠不要相信模擬器給你真實世界的表現。 – kcoppock

相關問題