1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

GLSurfaceView aktualisiert sich nicht automatisch

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von gurke1509, 31.03.2010.

  1. gurke1509, 31.03.2010 #1
    gurke1509

    gurke1509 Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    1
    Registriert seit:
    31.03.2010
    Hallo Zusammen,

    ich bin noch ein sehr unerfahrener Android-Programmierer und habe so meine liebe Müh und Not eine einfache 3D-Anwendung zu erstellen.

    Das was bereits läuft:
    Mein onCreate sieht wie folgt aus:
    Code:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
             view = new GLSurfaceView(this);
               view.setRenderer(new OpenGLRenderer());
               //view.setRenderMode(1); //RENDERMODE_WHEN_DIRTY:0, For RENDERMODE_CONTINOUSLY: 1
               setContentView(view);
               
               //Start the main program
               locationManager = (LocationManager)getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
               locationProvider = locationManager.getProvider("gps"); 
               locationListener = new LocationListener() {
                   public void onLocationChanged(Location l) {
                       position = l;
                   }
                   public void onProviderDisabled(String provider) {}
                   public void onProviderEnabled(String provider) {}
                   public void onStatusChanged(String provider, int status, Bundle extras) {}
               };
               
               //while(true){}
               //main();
        }
    Weiterhin ist
    Code:
    @Override
        protected void onPause() {
            super.onPause();
            view.onPause();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            view.onResume();
        }
    
    gesetzt.
    Mit Hilfe vom OpenGLRenderer werden drei Würfel erzeugt, die sich umeinander drehen. Das funktioniert auch prima. Jedoch, wenn ich das "while(true){}" auskommentiere, aktualisiert sich das GLSurfaceView nicht. Bedeutet, dass ich nur ein schwarzes Bild zu sehen bekomme. Wenn ich
    Code:
    view.setRenderMode(RENDERMODE_WHEN_DIRTY);
    setze und dann ein
    Code:
    while(true) view.requestRender()
    mache funktioniert dies ebenfalls nicht.

    Entferne ich die Schleife, aktualisiert sich alles wieder automatisch und ich sehe rotierende Vierecke.

    Hat jemand eine Ahnung, was ich falsch gemacht haben könnte?
     
  2. twit2k, 02.04.2010 #2
    twit2k

    twit2k Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    05.11.2009
    Ich denke das Problem lässt sich lösen wenn du die while Schleife in einen Thread packst. Das problem ist das du eine Endlosschleife startest und dadurch die OnCreate Methode garnicht mehr verlässt, da keine Abbruchbeingung vorhanden ist.

    versuch mal folgendes (alles nicht getestet):

    Code:
    Runnable foo = new Runnable(){
    
    public void run(){
       while(true){};
    
    }
    };
    
    Thread t = new Thread(foo);
    t.start();
    
    
    Sorry keine Ahnung wie man den Code im Editor hier einrückt.
    Damit sollte deine Whileschleife parrallel laufen
     
  3. gurke1509, 02.04.2010 #3
    gurke1509

    gurke1509 Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    1
    Registriert seit:
    31.03.2010
    Vielen Dank für den Hinweis. Das hatte ich auch bereits versucht, hatte aber keine Besserung gebracht. (Aber wie ich gerade sehe, lag es wohl eher daran, dass ich den neuen Thread falsch erstellt habe^^)

    Ich habe das Problem aber nun so gelöst, dass die main-loop des Spiels, was ich programmiere immer genau einmal aufgerufen wird. Und zwar dann, wenn sich das GLSurface neu zeichnet und die Methode onDrawFrame aufgerufen wird. Somit ist es immer noch eine Schleife, aber jeder Schleifendurchlauf wird von onDrawFrame angestoßen.

    Mit diesem Prinzip kann ich jetzt weiterarbeiten.

    Aber nochmals danke für den Tipp.

    Gruß
     

Diese Seite empfehlen