Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.07.2014, 16:24

[Android] Canvas in while-loop zeichnet nicht.

Hallo Menschen, ;)
ich bin gerade am versuchen, den Code diverser Tutorials zu befolgen (Beispiel ), weil mein eigener Code nicht funktionierte.
Wie sich herausstellt, existiert selbiges Problem auch hier:

Ich versuche, in meiner main loop in ein Canvas zu zeichnen.

Hier die run-Methode meiner GameLoopThread-Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Override
    public void run() {
        long ticksPS = 1000 / FPS;
        long startTime;
        long sleepTime;

        while(running) {
            Canvas c = null;

            startTime = System.currentTimeMillis();
            try {
                c = view.getHolder().lockCanvas();
                synchronized(view.getHolder()) {
                    view.onDraw(c);
                }
            } finally {
                if(c != null) {
                    view.getHolder().unlockCanvasAndPost(c);
                }
            }
            sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
            try {
                if(sleepTime > 0) {
                    sleep(sleepTime);
                } else {
                    sleep(10);
                }
            } catch(Exception e) {
            }
        }
    }


Hier die onDraw-Methode meiner GameView-Klasse:

Quellcode

1
2
3
4
5
@Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(bmp,100,100,null);
    }


onDraw wird tatsächlich aufgerufen, es gibt keine Fehlermeldung. Aber das Bild aktualisiert sich schlichtweg nicht.
Bei einigen Tests fand ich heraus, dass das Bild sich erst ändert, wenn die while-loop zueende ist.
Den Aufruf von onDraw durch invalidate oder postInvalidate zu ersetzen habe ich bereits probiert.
Habt ihr irgendwelche Ideen?

Danke im voraus,
Sound~Wave

MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

2

07.07.2014, 19:27

Das läuft aber nicht alles im selben Thread, oder?

3

07.07.2014, 21:02

run() ist eine Methode der Klasse GameLoopThread (extends Thread). Eine Instanz dieser wird in der Klasse GameView erzeugt und run entsprechend aufgerufen (nachdem running entsprechend gesetzt wurde).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

07.07.2014, 21:16

Wie genau startest Du den Thread?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

08.07.2014, 10:35

Seine Antwort klingt sehr danach, als würde er die run-Methode direkt aufrufen.
Ein direkter Aufruf dieser Methode ist nichts weiter, als ein Methodenaufruf, es findet so also kein Multithreading statt. Wenn der Thread parallel laufen soll, muss er über die start Methode gestartet werden.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

08.07.2014, 10:36

Genau deswegen frage ich ja.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

08.07.2014, 12:51

:dash:
Ich danke euch!

Werbeanzeige