Performance von Threads

Z

Zonnex

Erfahrenes Mitglied
49
Hi,

um Bewegung in ein Spiel zu kriegen benutze ich z.Z. zwei Threads mit jeweils einem Handler (Ausschnitt ganz unten im Beitrag)

Trotz der gesetzten Pausen via "handler.postDelayed(runnable, millisek)"
entstehen scheinbar durch den ausgeführten code enorme Verzögerungen, sprich der emulator/das Handy kommen nicht hinterher..

hab im Internet schon haufenweise Sachen über Threads gefunden u.a. LunarLander von Google... jedoch erschließt sich mir auch aus letzterem nicht wie man einen Thread macht der das Spiel immer in der selben Geschwindigkeit wiedergibt (ohne das schnellere Hardware das Spiel schneller macht)

Nachtrag:
- ohne "handler.postDelayed(runnable, millisek)" läuft das Programm scheinbar flüssig (sprich der ball rast von Ecke zu Ecke)
- beim berühren des Displays merkt man wie der Ball-Thread ruckelt





1. der Spieler wird in die Richtung der Touchposition bewegt
Code:
UpdateThread = new Runnable() 
        {
        	 
            @Override
            public void run() 
            {
            	if(i_pos != i_center)
    	{
    		if(i_pos > i_center)
    		{
    			i_center++;
    		}
    		else
    		{
    			i_center--;
    		}
    	}
    	postInvalidate();
            	updateHandler.postDelayed(this, 5);
            }
        };

2. ein Ball bewegt sich autmatisch und es wird geprüft ob eine Kollision mit dem Rand oder Spieler entsteht
Code:
updateHandler = new Handler();
        UpdateThread = new Runnable() 
        {
        	 
            @Override
            public void run() 
            {
            	if(isRun)
            	{
            		update();
                	updateHandler.postDelayed(this, 2);
            	}
            	else
            	{
            		gameStart();
            		updateHandler.postDelayed(this, 1000);
            	}
            	
            }
        };
        updateHandler.post(UpdateThread);

 public void update()
    {
    	kollision();
    	ball.move();
    }

    public void gameStart()
    {
    	if(i_start > 0)
    	{
    		tv_balls.setText("Spiel startet in " + i_start + " s!");
        	i_start--;
    	}
    	else
    	{
    		ball.reset();
    		isRun = true;
    		i_start = 5;
    		i_balls = 3;
    		tv_balls.setText("Bälle: " + i_balls);
    	}
    }
    
    public void kollision()
    {
    	
    	if(ball.getL() <= 0 || ball.getR() >= bg.getR())
    	{
    		ball.toggleX();
    	};
    	
    	if(ball.getT() <= 0)
    	{
    		ball.toggleY();
    	}
    	else if(ball.getB() >= player.getT())
    	{
    		if(ball.getCx() >= player.getL() && ball.getCx() <= player.getR())
    		{
    			ball.toggleY();
    		}
    		else
    		{
    			i_balls--;
    			if(i_balls > 0)
    			{
        			tv_balls.setText("Bälle: " + i_balls);
        			ball.reset();
    			}
    			else
    			{
    				tv_balls.setText("Loose!");
    				isRun = false;
    			}
    		};
    	};
    }
 
Zuletzt bearbeitet:

Ähnliche Themen

S
Antworten
17
Aufrufe
554
jogimuc
J
5
Antworten
22
Aufrufe
1.420
590239
5
M
Antworten
4
Aufrufe
1.173
swa00
swa00
Zurück
Oben Unten