2009-04-27 21 views
14

Estoy desarrollando un juego para Android. Está sucediendo mucho, pero funciona de forma razonablemente fluida. Eso es, por supuesto, hasta que el usuario toque la pantalla.¿Por qué los eventos táctiles destruyen mi velocidad de fotogramas de Android?

Mientras que están tocarlo, onTouchEvent se llama (con action = ACTION_MOVE, x = 0 y y = 0) aproximadamente una vez cada diez milisegundos a lo que parece ser bastante alta prioridad, ya que absolutamente oblitera la tasa de fotogramas. Tan pronto como el toque finaliza, la velocidad de fotogramas vuelve a su buen estado.

He intentado

  • que tenga una entrada onTouchEvent mango para el juego como de costumbre
  • tener onTouchEvent retorno true enseguida
  • no tener onTouchEvent aplicado en absoluto

el problema persiste en las tres situaciones.

¿Alguien ha encontrado esto? ¿Hay alguna forma de reducir la velocidad a la que se generan los eventos ACTION_MOVE, o asegurarse de que solo se generen cuando hay un movimiento real, o utilizar un método de sondeo que obtenga la ubicación actual del toque? ¿O incluso solo una forma de desactivarlo por completo?

Respuesta

12

Read este tema. Básicamente, usted quiere dormir el hilo del evento, ya que de lo contrario el sistema bombeará una gran cantidad de eventos (entre x, yy la presión siempre hay algún movimiento) que debe manejar.

+0

enlace ya no funciona. –

0

Quizás una solución algo obvia, pero ... ¿ha intentado solo manejar aproximadamente 1/10 de ellas? Si está haciendo un procesamiento que se desencadena cada 10 ms en el subproceso de interfaz de usuario, es probable que disminuya la velocidad de fotogramas, sí. ¿Qué ocurre si simplemente acumula un contador en su lugar y solo procesa una vez que ha superado un umbral mínimo?

1

que he estado tratando de seguir todo lo que ustedes han estado hablando acerca , pero tengo que admitir que después de probar varias formas de implementar lo que usted sugiere, todavía no he sido capaz de lograr cualquier positivo resultados. ¿Podría uno de ustedes proporcionar algún código de ejemplo? Específicamente, Me gustaría saber cómo hacer para que el hilo principal/IU duerma. Si es aplicable a mis juegos, también sería bueno saber cómo configurar en un modelo de sondeo como Jon implementado.

Así es como se ve mi código. En el hilo de interfaz de usuario:

public boolean onTouchEvent(MotionEvent event) { 
    // Store event somewhere the game thread can see it: 
    // ... 

    synchronized (someObject) { 
     try { 
      someObject.wait(1000L); 
     } catch (InterruptedException e) { 
     } 
    } 

    return true; 
} 

y en el hilo del juego:

void myGame() { 
    while (!stopping) { 
     // ... 

     // Get a touch event: 
     synchronized (someObject) { 
      someObject.notify(); 
     } 
     Thread.yield(); 

     // ... 
    } 
} 
0

Si desea una solución sin tener que lidiar con hilos de sincronización que puedo recomendar el uso de la interfaz Handler para enviar el evento y relevante datos usando un mensaje/paquete para el hilo de renderizado del juego. La solución del sueño insinuada aquí todavía se aplica.

0

Generalmente, los eventos vienen con una propiedad de marca de tiempo, por lo que es fácil calcular y acelerar la tasa de eventos.

if (currentEventTimestamp - lastEventTimestamp > 500) { 
 

 
    lastEventTimestamp = currentEventTimestamp; 
 

 
    // do something 
 

 
}

Cuestiones relacionadas