Autore Topic: Rallentamento gioco  (Letto 1143 volte)

Offline andri27

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    wildfire
  • Sistema operativo:
    android
Rallentamento gioco
« il: 29 Gennaio 2011, 15:46:50 CET »
0
salve,sto cercando di creare un gioco in android, con interfaccia normale, molto banale.
Purtroppo appena messo uno sfondo e una macchinina, il gioco mi rallenta, posto il codice così possiate darmi qualche dritta.

Codice (Java): [Seleziona]
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.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.MotionEvent;
 

public class RaindropsActivity extends Activity {
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new Panel(this));
    }
 
        class Panel extends SurfaceView implements SurfaceHolder.Callback {
            private RaindropsThread _thread;
            private int _x = 20;
            private int _y = 20;
            private int x_mac=95, y_mac;


            public Panel(Context context) {
                super(context);
                getHolder().addCallback(this);
                _thread = new RaindropsThread(getHolder(), this);
                setFocusable(true);
            }
         
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                        _x = (int) event.getX();
                        _y = (int) event.getY();
                }
                return true;
            }
         
            @Override
            public void onDraw(Canvas canvas) {
                       
               
                Bitmap _sfondo = BitmapFactory.decodeResource(getResources(),R.drawable.sfondo);
                canvas.drawBitmap(_sfondo, 0, 0, null);
         
                y_mac+=1;
                Bitmap _macchina = BitmapFactory.decodeResource(getResources(),R.drawable.macchina);
                canvas.drawBitmap(_macchina, x_mac, y_mac, null);
               
               
            }
         
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

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

                boolean retry = true;
                _thread.setRunning(false);
                while (retry) {
                    try {
                        _thread.join();
                        retry = false;
                    } catch (InterruptedException e) {

                    }
                }
            }
        }
 
    class RaindropsThread extends Thread {
        private SurfaceHolder _surfaceHolder;
        private Panel _panel;
        private boolean _run = false;
 
        public RaindropsThread(SurfaceHolder surfaceHolder, Panel panel) {
            _surfaceHolder = surfaceHolder;
            _panel = panel;
        }
 
        public void setRunning(boolean run) {
            _run = run;
        }
 
        @Override
        public void run() {
            Canvas c;
            while (_run) {
                c = null;
                try {
                    c = _surfaceHolder.lockCanvas(null);
                    synchronized (_surfaceHolder) {
                        _panel.onDraw(c);
                    }
                } finally {
                    if (c != null) {
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }
}
grazie.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Rallentamento gioco
« Risposta #1 il: 29 Gennaio 2011, 16:11:02 CET »
+1
Sposterei  il caricamento delle immagini dalla onDraw,
queste due chiamate pesantucce,vengono fatte ad ogni refresh:               
Codice (Java): [Seleziona]
Bitmap _sfondo = BitmapFactory.decodeResource(getResources(),R.drawable.sfondo);
Bitmap _macchina = BitmapFactory.decodeResource(getResources(),R.drawable.macchina);


prova ad inizializzare _sfondo e _macchina nel costruttore:

Codice (Java): [Seleziona]
private Bitmap _sfondo;
private Bitmap _macchina;
public Panel(Context context) {
                super(context);
                _sfondo = BitmapFactory.decodeResource(getResources(),R.drawable.sfondo);
                _macchina = BitmapFactory.decodeResource(getResources(),R.drawable.macchina);
                getHolder().addCallback(this);
                _thread = new RaindropsThread(getHolder(), this);
                setFocusable(true);
            }

Offline andri27

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    wildfire
  • Sistema operativo:
    android
Re:Rallentamento gioco
« Risposta #2 il: 29 Gennaio 2011, 16:51:00 CET »
0
grazie mille, molto meglio!!

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Rallentamento gioco
« Risposta #3 il: 27 Gennaio 2012, 17:06:41 CET »
0
Sono ad una situazione praticamente simile, solo che io le avevo già inizializzate nel costruttore. Faccio la postInvalidate nel Thread ogni secondo, ma ora che mi disegna la cartina sullo schermo ci vogliono 35 secondi °_° (una png da 14Kb....). Una volta partito il refresh non è proprio di un secondo ma di circa 2 secondi e va bè pazienza, però 35 secondi per caricare i dati mi sembra eccessivo...

Qualche consiglio?

P.S. Non posto il codice della View perchè sono un sacco di righe di codice e presumo non abbiate voglia di leggerle


EDIT: Trasformando la View in una SurfaceView ho eliminato il problema del caricamento di 35 secondi....Non capisco perchè...Cosa gli cambiava al sistema caricare una View piuttosto che una SurfaceView  ???
« Ultima modifica: 28 Gennaio 2012, 10:03:43 CET da Auron »
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)