onDraw Canvas jede Millisekunde aufrufen?

bruce85

Bekanntes Mitglied
Hallo,
der Titel sagt schon alles, wie kann ich ambesten die Methode onDraw jede Millisekunde aufrufen?
Ich möchte ein Paar animationen im Spiel laufen lassen, nur weiss ich nicht, wie ich das ambesten anstellen soll.

Wie könnte man das machen?

Ich bedanke mich schonmal im Voraus.

MfG
 

Network

Top Contributor
Jede Millisekunde ist schonmal viel zu viel Leistung die du da reinstecken willst.
Unser Auge kann nur eine maximale Framerate wahrnehmen und Bildschirme können auch nur eine bestimmte Framerate darstellen.

Jede Millisekunde ist zu viel, mach alle 10 Millisekunden daraus oder mehr, da sparst du schonmal 10mal mehr Leistung.
Unser Gehirn berechnet die Lücken dazwischen.

Animationen werden niemals über Zeichenmethoden verwaltet. Vieleicht habe ich das bei dir auch falsch verstanden.

Schlussendlich: Was ist daran so schwer die Methode onDraw() aufzurufen? Du holst dir das Canvas übergibst es und lässt zeichnen.
Ohne deine eigenen Ansätze/Code/Überlegungen kann man nur schwer raten was du genau wissen wills.

Gruß
Net
 

bruce85

Bekanntes Mitglied
Vielen Dank für die antwort.

z.B. Spieler bewegungen oder andere objekte, die sich im Spiel bewegen, deshalb möchte ich die onDraw Methode mit postInvalidate(); jede Paar Millisekunde neu Zeichnen, damit die bewegungen auch aktualisiert werden.

Wie könnte man das ambesten machen?

MfG
 

Bernd Hohmann

Top Contributor
Normalerweise hält man im Hintergrund zwei Images. Wärend man das erste Image löscht und neu bemalt wird das zweite angezeigt. Danach tauscht man einfach den Zähler für das aktuelle Bild von 1 auf 0 und malt auf Image 1 herum.

Den Wechsel zwischen den Bildern stimmt man so ab, dass ca. 30 Wechsel in der Sekunde stattfinden (sofern das Backend mithalten kann).

Nach jeder Teilbewegung bereits neu anzuzeigen ist nicht so glücklich weil die Übergabe des Images (letztendlich nur ein byte-Array) an die Hardware in Java relativ träge ist.

Bernd
 

bruce85

Bekanntes Mitglied
Danke Dir.

Das ist mir ein bisschen zu kompliziert, gibt es Vielleicht gute Tutorials, indem man in Android 2D Spiele Programmieren lernt oder wo Programmiert man ambesten 2D Spiele für Android?

Ich benutze derzeit Eclipse mit Android-SDK.

Danke schonmal.

MfG
 

bruce85

Bekanntes Mitglied
Hallo nochmal,
ich hab das mal so gemacht:
Java:
	public class Panel extends View implements OnTouchListener {
		public Panel(Context context) {
            super(context);

            myTimer = new Timer();
    		myTimer.schedule(new TimerTask() {			
    			@Override
    			public void run() {
    				TimerMethod();
    			}
    			
    		}, 0, 50);
        }
		
		private void TimerMethod() {
			postInvalidate();
		}

Das funktioniert, aber irgendwann an einer bestimmten Zeitpunkt, beendet sich die App einfach ohne irgendwelche fehlermeldung.

Ist das eigentlich Sinnvoll, das mit dem Timer so zu machen?
Oder wie könnte man das ambesten anders lösen?

MfG
 

bruce85

Bekanntes Mitglied
Ich hab das Problem gelöst.

Es lag daran, dass ich in onDraw Methode einen Font geladen habe und bei jedem aufruf von onDraw die Font erneut geladen wurde, deshalb hat sich das Spiel nach einer gewissen zeit beendet.

Ich hab das jetzt mit Thread gelöst, dass er nach jede 75 Millisekunde die Methode onDraw aufruft bzw. neu zeichnet:
Java:
public Panel(Context context) {
            super(context);
            myFont1 = Typeface.createFromAsset(getAssets(),"fonts/Comic Sans MS.ttf");
            paint.setAntiAlias(true);
            
            new Thread(new Runnable() {
                public void run() {
                    while(true){
                        try {
                            Thread.sleep(75);
                            postInvalidate();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
              }).start();
        }
nun funktioniert das.

Trotzdem vielen Dank für die Hilfe.

MfG
 
Zuletzt bearbeitet:

s4ke

Bekanntes Mitglied
Wie schauts mit einem Executor aus? Da spart man sich das Erstellen eines Threads bei jedem Aufruf der Methode (der Garbagecollector wird sich freuen).
 

Marco13

Top Contributor
So wie ich das sehe ist das ein Konstruktor, und der Thread wird nur EINmal gestartet. Aber nie beendet, das sollte man vielleicht nochmal reviewen ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Canvas onDraw() Variablen muss in der Methode initialisiert werden Android & Cross-Platform Mobile Apps 1
J Android Teile in onDraw() nur einmal zeichnen Android & Cross-Platform Mobile Apps 2
P trotz invalidate() wird onDraw() nicht aufgerufen Android & Cross-Platform Mobile Apps 15
A onDraw wird nicht aufgerufen Android & Cross-Platform Mobile Apps 14
Arif Android Canvas wird nicht gezeichnet? Android & Cross-Platform Mobile Apps 0
Dechasa Android Android - Canvas NullpointException Android & Cross-Platform Mobile Apps 2
F Mit Canvas zeichen und durch einen Timer aktualiesieren Android & Cross-Platform Mobile Apps 1
J Canvas mit dem Accelorometersensor bewegen Android & Cross-Platform Mobile Apps 0
E Android Zeichnen auf Canvas - Teilbereich als Bild speichern Android & Cross-Platform Mobile Apps 3
G canvas in view anzeigen Android & Cross-Platform Mobile Apps 10
S Android Canvas - drawText - Update Text in ActionListener Android & Cross-Platform Mobile Apps 8
B Java ME Canvas Android & Cross-Platform Mobile Apps 2
J Java ME Canvas Klasse Gameloop und Funktion Android & Cross-Platform Mobile Apps 2
B Java ME Leere Canvas Seite Android & Cross-Platform Mobile Apps 21
P Java ME Texteingabe Canvas Android & Cross-Platform Mobile Apps 2
D wie geht Klassenvererbung von Canvas Klassen Android & Cross-Platform Mobile Apps 2
U Probleme mit der drawString Methode bei Canvas Android & Cross-Platform Mobile Apps 8
H Canvas kann nichts auf Graphics drawen Android & Cross-Platform Mobile Apps 3
M Textfeld in Canvas, implementation der keys aendern Android & Cross-Platform Mobile Apps 8
M Text in Canvas scrollen lassen Android & Cross-Platform Mobile Apps 13
M Wie in einer anderen "nicht canvas" klasse zeichne Android & Cross-Platform Mobile Apps 5
U ein texteingabefeld auf einem Canvas . Android & Cross-Platform Mobile Apps 2
A Problem: Canvas-Grösse Motorola RAZR v3r Android & Cross-Platform Mobile Apps 8
F Canvas Stringlänge Android & Cross-Platform Mobile Apps 2
G Speichern jede zehnte sekunde Android & Cross-Platform Mobile Apps 1
G Realm (jede Sekunde schreiben) Android & Cross-Platform Mobile Apps 1
J BatterieWidget update jede Sekunde Android & Cross-Platform Mobile Apps 1
B AlarmManager triggert nicht jede Stunde Android & Cross-Platform Mobile Apps 7
M 20 Image Button für jede Auflösung positionieren Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben