2011-01-30 12 views
5

Estoy buscando ejemplo de ejemplo de código que muestra cómo lograr 30 fotogramas por segundo usando Android SurfaceView? Supongamos que cada cuadro dibuja un círculo comenzando en la posición xey y cada cuadro incrementa xey en uno.¿Cómo lograr 30 fotogramas por segundo con Android SurfaceView?

Pregunta de bonificación: Además de lo anterior, quiero superponer otra Vista para mostrar el contenido de texto de modo que los gráficos que se dibujen se muestren debajo de este contenido de texto. ¿Cómo se puede hacer esto?

Respuesta

3

realizar una rosca que hace esto 30 veces por segundo:

  1. SurfaceHolder.lockCanvas de llamadas().
  2. Dibuja en el lienzo (debe volver a dibujar por completo todos los píxeles).
  3. Llamar a SurfaceHolder.unlockCanvasAndPost().

De hecho, si su hilo solo se queda allí haciendo eso sin intentar pausar, se acelerará a la velocidad de cuadro de la pantalla.

Debe asegurarse de que este hilo esté sincronizado correctamente con la gestión de la vista de superficie; por ejemplo, si la superficie está cambiando o se está destruyendo, su código debe sincronizarse con el hilo para asegurarse de que el hilo deje de funcionar mientras esto pasa.

Por supuesto, esto significa que está haciendo una representación de software en el lienzo. Dependiendo de lo que esté haciendo, esto puede estar bien para darle una animación de 30 fps. De lo contrario, deberá usar GLSurfaceView. Es posible que desee considerar usar eso de todos modos, solo porque se ocupa de la parte de enhebrado para usted.

+0

¿Es realmente la mejor manera de hacerlo? – Derzu

6

Si desea altas velocidades de cuadro, realmente necesita leer en GLSurfaceView. En una vista de superficie normal, estará a merced de los cálculos de diseño de gastos y de la representación centrada en la CPU. Con GLSurfaceView puedes descargarlo a la GPU y tener un control eficiente de diseños.

+0

GLSurfaceView sólo acelera el dibujo (porque utiliza OpenGL para dibujar a él). No elimina los cálculos de diseño ... de hecho, nunca debe haber cálculos de diseño durante el dibujo, ni siquiera el dibujo de la jerarquía de vista normal. – hackbod

+1

"No elimina los cálculos de diseño" - ¿dije que sí? "nunca debería haber cálculos de diseño durante el sorteo". No dije eso tampoco? Sin embargo, hablar de ** tasas de fotogramas ** generalmente significa que algo se está moviendo/cambiando, lo que afectará los cálculos del diseño. Si está usando un administrador de diseño nativo, esto será costoso. –

+0

Si uso GLSurfaceView en lugar de SurfaceView, ¿cuánto afectaría esto al uso de la batería y qué efecto tendría en el uso de la batería si el dispositivo no tiene GPU y la CPU está haciendo todo el trabajo? Los usuarios finales no se preocupan por los ciclos de CPU/GPU, pero se preocupan por la cantidad de batería que la aplicación está drenando.Mi objetivo es encontrar el enfoque que no ponga más que una carga razonable en la batería. – ace

2

Esto tal vez un hilo viejo, pero creo que esto puede ayudar a otros. Aquí es un buen tutorial que encontré en el uso de SurfaceView: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

Y aquí es un buen artículo sobre cómo poner en práctica el juego de bucle que puede ayudar a limitar los FPS a 30: http://www.koonsolo.com/news/dewitters-gameloop/

se puede añadir texto directamente a su SurfaceView si se quiere, Aquí es un ejemplo

public void onDraw(Canvas canvas) { 
    ... 
    // Add text 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setFakeBoldText(true);    // if you like bold 
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);    
} 
Cuestiones relacionadas