2013-02-18 2 views
2

Я пытаюсь сделать очень простую игру. Пользователь должен попытаться поймать яблоко, используя корзину, перемещенную его пальцем. Все, кажется, работает очень хорошо, но у меня есть проблема: я хочу нарисовать фон для приложения. Но использование изображения в качестве backgorund делает приложение чрезвычайно медленным и вызывает много отставания. Если я использую белый фон, у меня нет проблем.Рисование фона сделать мое приложение медленным

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Я думаю, что это потому, что я рисую фон каждый раз, когда приложение обновляется, но я не знаю, как это изменить.

Возможно, мой код немного путаный, я все еще участвую.

Спасибо за помощь!

package com.cris9696.mela; 

import java.util.Random; 

import com.cris9696.mela.R; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.Typeface; 
import android.graphics.Paint.Align; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class Game extends Activity implements OnTouchListener { 

ClasseCanvas View; 
float xApple, yApple, xBasket, yBasket; 
Bitmap Apple, Basket, BackG; 
Random rnd = new Random(); 
int win = 0, score = 0, level = 1; 
int record = 0; 
Typeface Font; 
Paint TextP = new Paint(); 
Rect dest; 
Paint paint; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Font = Typeface.createFromAsset(getAssets(), "TF2.ttf"); 
    View = new ClasseCanvas(this); 
    View.setOnTouchListener(this); 
    TextP.setColor(Color.RED); 
    TextP.setTextSize(50); 
    TextP.setTypeface(Font); 
    xApple = yApple = xBasket = yBasket = 0; 
    xApple = rnd.nextInt(600); 
    Apple = BitmapFactory.decodeResource(getResources(), R.drawable.apple); 
    BackG = BitmapFactory 
      .decodeResource(getResources(), R.drawable.bg); 
    Basket = BitmapFactory.decodeResource(getResources(), 
      R.drawable.basket); 

    setContentView(View); 

} 

// ///////////////////////////////////////////////////////////////////////////// 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 

    xBasket = event.getX(); 
    yBasket = event.getY(); 
    /* 
    * switch (event.getAction()) { // ci dice cosa succede 
    * 
    * case MotionEvent.ACTION_DOWN: 
    * 
    * case MotionEvent.ACTION_UP: 
    * 
    * break; } 
    */ 
    return true; 
} 

// /////////////////////////////////////////////////////////////////////////// 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    View.pause(); 
} 

// ///////////////////////////////////////////////////////////////////////////// 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    View.resume(); 
} 

// /////////////////////////////////////////////////////////// 

public class ClasseCanvas extends SurfaceView implements Runnable { 

    SurfaceHolder Holder; 
    Thread thread = null; 
    boolean isRunning = true; 

    public ClasseCanvas(Context context) { 
     super(context); 
     Holder = getHolder(); 

     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (isRunning) { 
      if (!Holder.getSurface().isValid()) 
       continue; 

      Canvas canvas = Holder.lockCanvas(); 

      dest = new Rect(0, 0, getWidth(), getHeight()); 
      paint = new Paint(); 
      paint.setFilterBitmap(true); 
      canvas.drawBitmap(BackG, null, dest, paint); 
      TextP.setColor(Color.RED); 
      canvas.drawText(Integer.toString(score), 56, 56, TextP); 
      TextP.setColor(Color.BLACK); 
      canvas.drawText("Level " + Integer.toString(level), 115, 
        56, TextP); 
      if (xBasket != 0 && yBasket != 0) { 
       canvas.drawBitmap(Basket, xBasket - Basket.getWidth()/2, 
         yBasket - Basket.getHeight()/2, null); 
      } 
      canvas.drawBitmap(Apple, xApple, yApple, null); 
      if (yApple < canvas.getHeight()) 
       if (score >= 0) 
        yApple += 5 * level; 
       else 
        yApple += 5; 
      else { 
       yApple = 0; 
       score--; 
       xApple = rnd.nextInt(canvas.getWidth() - Apple.getWidth()); 
      } 
      if (score > record) 
       record = score; 
      if (score == 10) { 
       level++; 
       score = 0; 
      } 
      if ((xApple >= xBasket - (Basket.getWidth()/2) 
        && xApple + (Apple.getWidth()) <= xBasket 
          + (Basket.getWidth()/2) && yApple >= yBasket && yApple <= yBasket 
        + Basket.getHeight()) 
        || (xApple >= xBasket - (Basket.getWidth()/2) 
          && xApple <= xBasket + (Basket.getWidth()/2) 
          && yApple >= yBasket && yApple <= yBasket 
          + Basket.getHeight()) 
        || (xApple + (Apple.getWidth()) >= xBasket 
          - (Basket.getWidth()/2) 
          && xApple + (Apple.getWidth()) <= xBasket 
            + (Basket.getWidth()/2) 
          && yApple >= yBasket && yApple <= yBasket 
          + Basket.getHeight())) { 
       win = 1; 
       xApple = rnd.nextInt(canvas.getWidth()); 
       yApple = 0; 
       score++; 
      } 

      Holder.unlockCanvasAndPost(canvas); 
     } 
    } 

    public void pause() { 
     isRunning = false; 
     while (true) { 
      try { 
       thread.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      break; 
     } 
     thread = null; 
     // TODO Auto-generated method stub 
    } 

    public void resume() { 
     // TODO Auto-generated method stub 
     isRunning = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

} 
} 

ответ

1

Dont сделать фоновое изображение в методе OnDraw из SurfaceView. Каждый раз, когда поверхностьView изменяется, он перерисовывает все это растровое изображение.

Лучше всего добавить SurfaceView в LinearLayout, а затем установить LinearLayout в качестве ContentView в методе onCreate. Установите фон linearLayout равным R.drawable.bg, так что он будет только один раз нарисован.

редактировать

Так что ваш файл XML сматывания SurfaceView в линейной компоновке и установить Б.Г. в LinearLayout. Проблема в том, что вы не используете этот макет в методе onCreate.

в вашем XMl, изменение <SurfaceView до <com.cris9696.mela.game.ClasseCanvas. Затем в вашем методе onCreate вы можете сделать следующее:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); // the XML layout you created. 

    View = (ClasseCanvas) findViewById(R.id.View); // the ClasseCanvas view in your XML file. 
    View.setOnTouchListener(this); 

    Font = Typeface.createFromAsset(getAssets(), "TF2.ttf"); 

    TextP.setColor(Color.RED); 
    TextP.setTextSize(50); 
    TextP.setTypeface(Font); 

    xApple = yApple = xBasket = yBasket = 0; 
    xApple = rnd.nextInt(600); 

    Apple = BitmapFactory.decodeResource(getResources(), R.drawable.apple); 
    BackG = BitmapFactory.decodeResource(getResources(), R.drawable.bg); 
    Basket = BitmapFactory.decodeResource(getResources(),R.drawable.basket); 

} 
+0

Это мой новый xml-макет. http://pastebin.com/cksKMjDy Неправильно? –

+0

Отметьте мое редактирование. И не забудьте принять ответ, если он сработает! – wdziemia

0

Похоже, что ваше приложение заполнено пробелом. Вы пытались отключить фильтрацию и сглаживание для фона? Кроме того, попробуйте запустить приложение с профилировщиком и посмотреть рисунок фона. Сравните время, затрачиваемое ЦП на рисование фона на оставшуюся часть вашей игры. Если он слишком высок, это означает, что ваше устройство не может передавать пиксели достаточно быстро, и вам следует отключить фильтры, по крайней мере, для рисования фона.

Fillrate on wiki