지금 테스트용으로 (단말기 디자이어) (2.2 API8버전)

82x82짜리 16장 png를 순서대로 돌리는데,

같은 그림을 몇개씩 더 돌리면 프레임이 낮아지고

21개정도를 동시에 돌리니

20프레임이 조금안나오네요


원래그런것인가요?

아니면 그림을 그리는데 더 효율적인방법이나

프레임을 높일 수 있는 방법이 있을까요?

+또 그림을 뒤집어 출력하는 방법이 있을까요? 오른쪽으로가는그림을 뒤집어 왼쪽으로 가는그림을 만들 수있게요.

밑은 소스입니다.

public class DrawView extends SurfaceView implements Callback
{
 //선언 부
 Paint paint = new Paint();
 Canvas mCanvas = null;
 SurfaceHolder mHolder = getHolder();
 
 private Bitmap mImgBack0;
 
 private Drawable ch_main[][] = new Drawable[4][16]; //캐릭터 [현재 행동] [프레임 수]
// ch_main[0] = new Drawable[6];
// ch_main[1] = new Drawable[16];
 
 int frame=0; 
 
 //클래스 선언
 Variable variable = new Variable();   //전역 변수
 FrameProcess frameProcess = new FrameProcess(); //프레임 계산 클래스
 
 public DrawView(Context context)
 {
  super(context);
  
  init(context);
 }
 
 public DrawView(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  init(context);
 }
 
 public DrawView(Context context, AttributeSet attrs, int defStyle)
 {
  super(context, attrs, defStyle);
  init(context);
 }
 
 //초기화
 private void init(Context context)
 {
  mHolder.addCallback(this);
  Resources res = context.getResources();
  
  //그림 리소스 갖기
  //메인 캐릭터
   //idle
  ch_main[0][0] = context.getResources().getDrawable(R.drawable.ch_idle_0);
   ......
 ch_main[0][5] = context.getResources().getDrawable(R.drawable.ch_idle_5);

   //run
  ch_main[1][0] = context.getResources().getDrawable(R.drawable.ch_run_0);
   ......
  ch_main[1][15] = context.getResources().getDrawable(R.drawable.ch_run_15);
  
  //프레임 출력 용
  variable.frame = 0;
  variable.second = 0;
  variable.presecond = 0;
  
  //캐릭터
   //캐릭터 정보
  variable.ch_action = 1; //현재 행동 (state : 0-idle, 1-run, 2-jump)
  variable.ch_position[0] = 100; //포지션 X
  variable.ch_position[1] = 400; //포지션 Y
   //캐릭터 애니메이션 용
  variable.ch_frame_limit[0] = 6; //애니메이션 수 [캐릭터]
  variable.ch_frame_limit[1] = 16;
   //캐릭터 애니메이션 딜레이
  variable.ch_delay[0] = 10;
  variable.ch_delay[1] = 2;
  variable.ch_delay[2] = 0;
  variable.ch_delay[3] = 0;
  variable.ch_delay_frame = 0;

  //그림 파일 정보
  for(int roll=0; roll<2; roll++)
  {
   //그림 사이즈 [행동][X]
   variable.ch_size[roll][0] = ch_main[roll][0].getIntrinsicWidth();
   //그림 사이즈 [행동][Y]
   variable.ch_size[roll][1] = ch_main[roll][0].getIntrinsicHeight();
   //중심 (그림 사이즈의 반) [행동][X]
   variable.ch_center[roll][0] = variable.ch_size[roll][0]/2;
   //중심 (그림 사이즈의 반) [행동][Y]
   variable.ch_center[roll][1] = variable.ch_size[roll][1]/2;
  }
  
 }

 
 
 public void update() 
 {
 // variable.ch_position[0]++;
  
  //프레임 값 얻는 함수 호출 frame : 프레임값이 저장될 변수
  frame = frameProcess.FramePrint(variable, frame);
  
//이동 테스트
//  variable.ch_position[0]+=1; 
  
  
  frameProcess.FrameRate(variable);
  
  //그리기 함수 호출
  invalidate();
 }

 
 
 @Override
 public void draw(Canvas canvas)
 {
  // TODO Auto-generated method stub
  super.draw(canvas);
  
  Rect main_position; //캐릭터를 그리기 위한 사각형 선언
  //그림의 X중심, Y맨 아래가 기준점이다.
  main_position = new Rect(variable.ch_position[0] - variable.ch_center[variable.ch_action][0], // X
         variable.ch_position[1] - variable.ch_size[variable.ch_action][1], // Y
          variable.ch_position[0] + variable.ch_center[variable.ch_action][0], // SizeX
         variable.ch_position[1]);// SizeY

  
  ch_main[variable.ch_action][variable.ch_frame].setBounds(main_position);
  ch_main[variable.ch_action][variable.ch_frame].draw(canvas);
  
  
  
  //여러 장의 그림을 동시에 출력해보기 테스트
  for(int roll1=0; roll1<3; roll1++)
  {
   for(int roll=0; roll<7; roll++)
   {
    main_position = new Rect(variable.ch_position[0] - variable.ch_center[variable.ch_action][0]+ (roll*100), // X
       variable.ch_position[1] - variable.ch_size[variable.ch_action][1]- (roll1*120), // Y
        variable.ch_position[0] + variable.ch_center[variable.ch_action][0]+ (roll*100), // SizeX
       variable.ch_position[1]- (roll1*120));// SizeY
    ch_main[variable.ch_action][variable.ch_frame].setBounds(main_position);
    ch_main[variable.ch_action][variable.ch_frame].draw(canvas);
   }
  }
  canvas.drawText("Frame : "+frame, 10, 10, paint);
  
  //갱신 함수 호출
  update();
 }

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

 @Override
 public void surfaceCreated(SurfaceHolder holder)
 {
  // TODO Auto-generated method stub
  try
  {
   mCanvas = mHolder.lockCanvas(null);
   draw(mCanvas);
  }
  finally
  {
   if(mCanvas != null)
   {
    mHolder.unlockCanvasAndPost(mCanvas);
   }
  }
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder)
 {
  // TODO Auto-generated method stub
  
 }
}