Jogo lento [RESOLVIDO]

Estou estudando com um livro da casa do codigo e precisei de uma imagem como background e uma para o player e antes de colocar as imagens png rodava muito rapido mas quando coloquei essas duas imagens o jogo ficou muito lento, se for por causa do tamanho da imagem como saber qual o melhor tamanho para economizar memoria e ser compátivel com outros dispositivos de tamanhos diferentes.

aqui o codigo

[code]package br.com.casadocodigoi.mpossible;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Impossible extends SurfaceView implements Runnable {
boolean running = false;
Paint paint;
SurfaceHolder holder;
Thread renderThread = null;
int enemyRadius, enemyX, enemyY;
int playerY = 200, playerX = 200, playerRadius = 50, score;
double distance;
boolean gameover = false;

public Impossible(Context context) {
	super(context);
	paint = new Paint();
	holder = getHolder();

}

@Override
public void run() {
	while (running) {
		// verifica se a tela está pronta
		if (!holder.getSurface().isValid())
			continue;
		// Lock the Canvas
		Canvas canvas = holder.lockCanvas();
		// desenha o player
		// canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),
				R.drawable.sky), 0, 0, null);
		drawPlayer(canvas);
		drawEnemy(canvas);

		// verifica colisão
		checkCollision();

		if (gameover) {
			drawButtons(canvas);
			drawScore(canvas);
			stopGame(canvas);
			break;

		}
		// Placar
		drawScore(canvas);

		// Desenhar botoes
		drawButtons(canvas);

		// Atualiza e desbloqueia o canvas
		holder.unlockCanvasAndPost(canvas);

	}

}

public void drawPlayer(Canvas canvas) {
	paint.setColor(Color.GREEN);
	//canvas.drawCircle(playerX, playerY, playerRadius, paint);
	canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),
			R.drawable.nave), playerX-50,playerY-50, null);

}

public void drawEnemy(Canvas canvas) {
	paint.setColor(Color.RED);
	enemyRadius++;
	canvas.drawCircle(enemyX, enemyY, enemyRadius, paint);
}

public void moveDown() {
	playerY += 10;
}

public void checkCollision() {
	// verifica hipotenusa
	distance = Math.pow(playerY - enemyY, 2)
			+ Math.pow(playerX - enemyX, 2);
	distance = Math.sqrt(distance);

	if (distance <= enemyRadius + playerRadius) {
		gameover = true;
	}

}

public void resume() {
	running = true;
	renderThread = new Thread(this);
	renderThread.start();
}

public void stopGame(Canvas canvas) {
	paint.setStyle(Style.FILL);
	paint.setColor(Color.YELLOW);
	paint.setTextSize(60);
	canvas.drawText("Perdeu PlayBoy!", 20, getHeight() / 2, paint);
	holder.unlockCanvasAndPost(canvas);

}

public void drawScore(Canvas canvas) {
	// placar
	paint.setColor(Color.WHITE);
	paint.setStyle(Style.FILL);
	paint.setTextSize(50);
	canvas.drawText(String.valueOf(score), getWidth() / 2, 75, paint);
}

public void addPoints(int points) {
	score += points;
}

public void drawButtons(Canvas canvas) {
	// Restart
	paint.setColor(Color.WHITE);
	paint.setStyle(Style.FILL);
	paint.setTextSize(30);
	canvas.drawText("Restart", 50, 200, paint);

	// Exit
	paint.setColor(Color.WHITE);
	paint.setStyle(Style.FILL);
	paint.setTextSize(30);
	canvas.drawText("Extit", 50, 350, paint);
}

public void init() {
	score = 0;
	playerX = 200;
	playerY = 200;
	playerRadius = 50;
	enemyX = 0;
	enemyY = 0;
	enemyRadius = 0;
	gameover = false;
	resume();
}

}[/code]

[code]package br.com.casadocodigoi.mpossible;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;

public class Game extends Activity implements OnTouchListener {
Impossible view;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	// Deixar full screem
	requestWindowFeature(Window.FEATURE_NO_TITLE);
	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
			WindowManager.LayoutParams.FLAG_FULLSCREEN);

	view = new Impossible(this);

	setContentView(view);
	view.setOnTouchListener(this);

}

@Override
protected void onResume() {

	super.onResume();
	view.resume();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
	
	if (event.getX()<150 && event.getY() >170 && event.getY()<200){
		view.init();
	}
	else if (event.getX()<120 && event.getY() >330 && event.getY()<360){
		System.exit(0);
	}else{
	
	view.moveDown();
	view.addPoints(100);
	}
	return true;
}

}
[/code]

Seu unico problema (até onde li) é:

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),  
                    R.drawable.sky), 0, 0, null);  

Nunca faça o Decode de imagens em métodos de drawn, a cada loop voce vai carregar em memoria seu drawable.sky; o que gasta processamento, tempo e memoria; carregue-a num método de init() da sua classe e reutilize-a nesse método.

Blz! Obrigado!