Alex F.
- Forum-Beiträge: 6
27.07.2013, 23:47:07 via Website
27.07.2013 23:47:07 via Website
Ich bin dabei ein Spiel mit Java zu programmieren. Ich habe aber ein Problem mit der Performance. Ein einfaches Objekt als Bitmap soll sich relativ schnell auf dem Bildschirm bewegen. Es funktioniert aber nie flüssig. Immer gibt es kleine Ruckler oder Sprünge in der Bewegung, es läuft jedenfalls nicht dauerhaft gleichmäßig wie man es sonst von Android Spielen kennt.
Ich rufe in einer Schleife „canvas.drawBitmap(bmp, x, y, null)“ auf und verändere anschließend beispielsweise die y-Koordinate um 10 Einheiten, damit es die passende Geschwindigkeit hat, aber die Bewegung ist nicht flüssig. Es funktioniert weder mit fester Framerate wie in meinem Code unten, noch mit variabler Framerate, wo die Koordinate abhängig von der Dauer des Schleifendurchlaufs verändert wird. Das Objekt soll sich unabhängig vom jeweiligen Handy immer gleich schnell bewegen.
Über eine kleine Hilfe für einen funktionierenden Code ohne Ruckler würde ich mich freuen
Ich rufe in einer Schleife „canvas.drawBitmap(bmp, x, y, null)“ auf und verändere anschließend beispielsweise die y-Koordinate um 10 Einheiten, damit es die passende Geschwindigkeit hat, aber die Bewegung ist nicht flüssig. Es funktioniert weder mit fester Framerate wie in meinem Code unten, noch mit variabler Framerate, wo die Koordinate abhängig von der Dauer des Schleifendurchlaufs verändert wird. Das Objekt soll sich unabhängig vom jeweiligen Handy immer gleich schnell bewegen.
Über eine kleine Hilfe für einen funktionierenden Code ohne Ruckler würde ich mich freuen
1public class MainActivity extends Activity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(new Gameview(this));
7
8 }
9
10}
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(new Gameview(this));
7
8 }
9
10}
1public class Gameview extends SurfaceView{
2
3 private SurfaceHolder surfaceHolder;
4 private Bitmap bmp;
5 private GameLoopThread theGameLoopThread;
6
7 int x = 200;
8 int y = 1200;
9
10 public Gameview(Context context) {
11 super(context);
12 theGameLoopThread = new GameLoopThread(this);
13 surfaceHolder = getHolder();
14
15 surfaceHolder.addCallback(new SurfaceHolder.Callback() {
16
17 public void surfaceDestroyed(SurfaceHolder holder) {
18 boolean retry = true;
19 theGameLoopThread.setRunning(false);
20 while(retry){
21 try {
22 theGameLoopThread.join();
23 retry=false;
24 }catch(InterruptedException e){
25
26 }
27 }
28
29 }
30
31 public void surfaceCreated(SurfaceHolder holder) {
32 theGameLoopThread.setRunning(true);
33 theGameLoopThread.start();
34 }
35
36 public void surfaceChanged(SurfaceHolder holder, int format,
37 int width, int height) {
38
39 }
40 });
41
42
43 bmp = BitmapFactory.decodeResource(getResources(),
44 R.drawable.ic_launcher);
45 }
46 @Override
47 public void draw(Canvas canvas) {
48
49 canvas.drawColor(Color.DKGRAY);
50
51 canvas.drawBitmap(bmp, x, y, null);
52
53 y = y-10;
54
55 if(y<=0){y=1200;}
56
57 }
58
59}
2
3 private SurfaceHolder surfaceHolder;
4 private Bitmap bmp;
5 private GameLoopThread theGameLoopThread;
6
7 int x = 200;
8 int y = 1200;
9
10 public Gameview(Context context) {
11 super(context);
12 theGameLoopThread = new GameLoopThread(this);
13 surfaceHolder = getHolder();
14
15 surfaceHolder.addCallback(new SurfaceHolder.Callback() {
16
17 public void surfaceDestroyed(SurfaceHolder holder) {
18 boolean retry = true;
19 theGameLoopThread.setRunning(false);
20 while(retry){
21 try {
22 theGameLoopThread.join();
23 retry=false;
24 }catch(InterruptedException e){
25
26 }
27 }
28
29 }
30
31 public void surfaceCreated(SurfaceHolder holder) {
32 theGameLoopThread.setRunning(true);
33 theGameLoopThread.start();
34 }
35
36 public void surfaceChanged(SurfaceHolder holder, int format,
37 int width, int height) {
38
39 }
40 });
41
42
43 bmp = BitmapFactory.decodeResource(getResources(),
44 R.drawable.ic_launcher);
45 }
46 @Override
47 public void draw(Canvas canvas) {
48
49 canvas.drawColor(Color.DKGRAY);
50
51 canvas.drawBitmap(bmp, x, y, null);
52
53 y = y-10;
54
55 if(y<=0){y=1200;}
56
57 }
58
59}
1public class GameLoopThread extends Thread {
2
3 static final long FPS = 30; //feste Framerate
4 private GameView theView;
5 private boolean isRunning = false;
6 long TPS = 1000 / FPS;
7 long startTime, sleepTime;
8 Canvas theCanvas = null;
9
10 public GameLoopThread(GameView theView) {
11 this.theView = theView;
12 }
13
14 public void setRunning(boolean run) {
15 isRunning = run;
16 }
17
18 @Override
19 public void run() {
20
21
22 while (isRunning) {
23
24 startTime = System.currentTimeMillis();
25
26 try {
27 theCanvas = theView.getHolder().lockCanvas();
28 synchronized (theView.getHolder()) {
29 theView.draw(theCanvas); //Hier wird draw aufgerufen
30 }
31 } finally {
32 if (theCanvas != null) {
33 theView.getHolder().unlockCanvasAndPost(theCanvas);
34 }
35 }
36
37 sleepTime = TPS - (System.currentTimeMillis() - startTime);
38 try {
39 if (sleepTime > 0) //Für unabhängige Geschwindigkeit
40 try {
41 Thread.sleep(sleepTime);
42 } catch (InterruptedException e) {}
43 else
44 sleep(1);
45
46 } catch (Exception e) {
47
48 }
49
50 }
51 }
52}
2
3 static final long FPS = 30; //feste Framerate
4 private GameView theView;
5 private boolean isRunning = false;
6 long TPS = 1000 / FPS;
7 long startTime, sleepTime;
8 Canvas theCanvas = null;
9
10 public GameLoopThread(GameView theView) {
11 this.theView = theView;
12 }
13
14 public void setRunning(boolean run) {
15 isRunning = run;
16 }
17
18 @Override
19 public void run() {
20
21
22 while (isRunning) {
23
24 startTime = System.currentTimeMillis();
25
26 try {
27 theCanvas = theView.getHolder().lockCanvas();
28 synchronized (theView.getHolder()) {
29 theView.draw(theCanvas); //Hier wird draw aufgerufen
30 }
31 } finally {
32 if (theCanvas != null) {
33 theView.getHolder().unlockCanvasAndPost(theCanvas);
34 }
35 }
36
37 sleepTime = TPS - (System.currentTimeMillis() - startTime);
38 try {
39 if (sleepTime > 0) //Für unabhängige Geschwindigkeit
40 try {
41 Thread.sleep(sleepTime);
42 } catch (InterruptedException e) {}
43 else
44 sleep(1);
45
46 } catch (Exception e) {
47
48 }
49
50 }
51 }
52}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.