2010-12-02 7 views
7

Estoy tratando de crear un GLSurfaceView que muestra un mapa de un área de juego. Cuando el jugador se mueve, la actividad del juego llama a highlightSpot, que a su vez debe activar una solicitud de renderizado. El único momento en que quiero volver a dibujar la vista es cuando el jugador se mueve.GLSurfaceView se reproduce de forma continua a pesar de cambiar el modo de procesamiento

Sin embargo, con mi implementación actual, a pesar de llamar a setRenderMode(RENDERMODE_WHEN_DIRTY) en mi GLSurfaceView, su modo de renderizado parece ser continuo. Para comprobarlo, lancé una única instrucción println en mi método onDrawFrame, y cuando ejecuto mi aplicación, la salida rellena rápidamente mi logcat sin que el reproductor se mueva ni siquiera una vez, claramente no se está comportando como pretendía. ¿Hay algo más que deba hacer para que la vista se visualice solo cuando se le pregunte?

(La mayor parte de este código se deriva de los tutoriales en http://insanitydesign.com/wp/projects/nehe-android-ports/. Omití mi onDrawFrame, OnSurfaceChanged y métodos onSurfaceCreated en aras de la concisión, ya que no estoy cambiando el modo de procesado o solicitar un render en cualquier parte de esos métodos . Si alguien piensa que podría ser relevante, también puedo publicarlos.)

public class SurfaceViewClass extends GLSurfaceView implements Renderer { 
    public SurfaceViewClass(Context context) { 
     super(context); 

     ... 

     this.setRenderer(this); 
     this.setRenderMode(RENDERMODE_WHEN_DIRTY); 
    } 

    public void highlightSpot(int x, int y) { 
     /* change some variables here */ 
     ... 

     this.requestRender(); 
    } 
} 

Respuesta

6

Bien, creo que tengo esto resuelto. El lugar para establecer el modo de renderizado parece ser la clase que contiene su objeto GLSurfaceView, no en el constructor GLSurfaceView. Además (algo que creo que pasé por alto en the Android documentation for GLSurfaceView) no puede establecer el modo de renderizado de GLSurfaceView antes de configurar su procesador. Esta es quizás la razón por la cual intentar establecer el modo de representación en el constructor no funciona.

Esto parece obligarlo a rendir sólo cuando yo quiero que, que es exactamente lo que quería:

public class Game extends Activity { 
private GLSurfaceView glSurface; 
private SurfaceViewClass svc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    glSurface = (GLSurfaceView) findViewById(R.id.SurfaceView01); 

    svc = new SurfaceViewClass(this); 
    glSurface.setRenderer(svc); 
    glSurface.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 

public void movePlayer() { 
    svc.highlightSpot(location[PLAYER], 0); 
    glSurface.requestRender(); 
} 
} 
+0

Nota: Después de arreglar esto, también se elimina la declaración requestRender en mi función highlightSpot, ya que llame a requestRender desde movePlayer() ahora en su lugar. Creo que funcionaría en highlightSpot bien, pero solo necesito llamarlo una vez. –

+1

En realidad, no, no funcionaría en highlightSpot(), porque debe invocarse en el objeto GLSurfaceView, no en el objeto SurfaceViewClass que utilizo como representador. Podría haber evitado tener que hacer esta pregunta por completo si no hubiera logrado confundir los dos. –

Cuestiones relacionadas