2011-04-15 8 views
9

Frecuencia de fotogramas: Me refiero a la velocidad a la que cambia la visualización. es decir, se llama Ondraw() y se vuelve a dibujar el lienzo.Android: ¿Cómo encontrar la velocidad de cuadro de un dispositivo?

¿Hay una tarifa predeterminada para todos los dispositivos Android? Como esta tasa depende de la potencia de procesamiento del dispositivo, ¿cómo averiguar la velocidad de fotogramas de un dispositivo antes de comenzar a programar para ese dispositivo móvil?

+0

¿Estamos hablando de una superficie GL, o en general (como cuando se usa una animación)? No hay una tasa de fotogramas predeterminada, puedo decir eso por adelantado. – EboMike

+0

¡Solo para decir animación 2D! usando vistas de superficie – m4n07

Respuesta

6

Esto puede ser una continuación de this question, donde sugerí que tener un ciclo de redibujado que simplemente seguía dibujando una y otra vez podría ser un poco excesivo. Puede haber una API para averiguar las capacidades de la pantalla de los dispositivos, pero si la hay no la conozco. Cuando está escribiendo su propia función de bucle/secuencia de eventos, puede controlar la velocidad de fotogramas por la frecuencia con la que llama a su método de "dibujado". Normalmente, creo que para la mayoría de los propósitos, estarías bien con una frecuencia de actualización de 30 o más. Si estás escribiendo un juego de acción rápida, que necesita animación rápida, entonces puede querer correr lo más rápido que puedas, mientras más fps, más suave será.

Un bucle de eventos típica (función de ejecución de rosca) podría ser algo como esto:

// define the target fps 
private static final int UPDATE_RATE = 30; // Frames per second (fps) 

public void run() { 
    while(running) { // volatile flag, set somewhere else to shutdown 
     long beginTimeMillis, timeTakenMillis, timeLeftMillis; 

     // get the time before updates/draw 
     beginTimeMillis = System.currentTimeMillis(); 

     // do the thread processing/draw 
     performUpdates(); // move things if required 
     draw();   // draw them on the screen 

     // get the time after processing and calculate the difference 
     timeTakenMillis = System.currentTimeMillis() - beginTimeMillis; 

     // check how long there is until we reach the desired refresh rate 
     timeLeftMillis = (1000L/UPDATE_RATE) - timeTakenMillis; 

     // set some kind of minimum to prevent spinning 
     if (timeLeftMillis < 5) { 
      timeLeftMillis = 5; // Set a minimum 
     } 

     // sleep until the end of the current frame  
     try { 
      TimeUnit.MILLISECONDS.sleep(timeLeftMillis); 
     } catch (InterruptedException ie) { 
     } 
    } 
} 
+0

Me temo que esto no es una buena idea por una razón no tan obvia: si la pantalla del teléfono se actualiza a una velocidad que no es un múltiplo de 30 (por ejemplo, 48, como el Doogee X20L) , entonces la animación no será suave. Esto se debe a que se mostrarán 48 marcos de todos modos, pero solo 30 diferentes (proporcionados por el código), lo que significa que algunos de ellos serán visibles durante 1/48 segundos y algunos durante 2/48 segundos. Esto causa un efecto nervioso que te hace pensar "algo está mal aquí, pero realmente no puedo explicarlo". –

2

No se puede confiar en una cierta tasa de fotogramas. Android usa un sistema operativo multitarea. Si hay algunos subprocesos ejecutándose en el fondo que hacen un trabajo pesado, es posible que no pueda alcanzar la velocidad de fotogramas que desea. Incluso si usted es el único proceso activo, la velocidad de cuadros depende de su GPU y CPU, y del reloj de cada uno. Tal vez el usuario tiene una ROM pirateada que cambia el reloj a un valor personalizado.

Es posible que algunos teléfonos estén bloqueados con una determinada velocidad de fotogramas. El HTC EVO se bloqueó a 30 fps durante más tiempo, hasta que salieron ROM personalizados que eliminaron esa limitación. Los ROM EVO más recientes también eliminaron esa limitación.

No sé lo que estás tratando de hacer, pero tu mejor opción es medir el tiempo después de cada fotograma y usar ese delta para tus animaciones. Si intentas mostrar el FPS, utiliza un promedio suavizado.

4

Puede usar la herramienta dumpsys proporcionada por Android. Para obtener información acerca de la pantalla del dispositivo de ejecutar el comando:

adb shell dumpsys display 

La información sobre la velocidad de fotogramas del dispositivo se proporciona en la sección "MPhys" atributo.

Va a encontrar algo como:

mPhys=PhysicalDisplayInfo{1080x1920, 60.000004 fps, densitiy 3.0, 
480.0x480.0 dpi, secure true} 

La velocidad de fotogramas del dispositivo se encuentra en el segundo campo, en mi caso es 60.000004 fps

+0

Esta es la respuesta correcta.El FPS que obtienes aquí es el máximo que podrás alcanzar en ese dispositivo, independientemente de si estás usando un dibujo de software en un lienzo (con 'lockCanvas()') en un 'SurfaceView' (en un bucle) o hardware OpenGL rendering (en 'onDrawFrame()') en un 'GLSurfaceView'. Creo que este valor debería ser idealmente 60 (la sugerencia de Google es apuntar a eso en https://developer.android.com/training/testing/performance.html), pero puede ser menor (por ejemplo, es 47.24 en una marca). nuevo Doogee X20L). No he visto un teléfono donde sea más alto. Es 60 en un Huawei P9 Lite o un Moto X. –

Cuestiones relacionadas