2012-11-14 5 views
3

나는 this 자습서를 따라 왔습니다. 나는 코드를 가지고 놀고 있었고, 필자는 필자가 필요로하지 않는 것들을 추가하고 등을 추가했지만, 에뮬레이터에서 블록을 실행하면 블록이 매우 불안정한 모션으로 움직인다. 내가 낮은 FPS를 얻는 것 같아. 응용 프로그램을 실행하는 첫 번째 또는 두 번째의 경우 원활하게 실행되고 닫히기 전에 다시 컴파일 할 때 약 1 초 동안 다시 실행됩니다. 모든 아이디어를 매끄럽게 실행하는 방법은?내 안드로이드 응용 프로그램의 속도가 느린 이유는 무엇입니까?

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

관련 문제