ARviewer

Comparación del rendimiento de ARviewer y ARviewer-PhoneGap

En este apartado veremos un análisis del tiempo de cómputo necesario para representar un grupo de nodos en realidad aumentada utilizando las mencionadas aplicaciones. Para el análisis hemos considerado el terminal Nexus S y hemos igualado las condiciones de ambas todo lo posible, eliminando elementos sin interés para el análisis que puedan influir en este tiempo, como los "shaders".

Hemos elegido una muestra de 20 nodos de tipo imagen (pertenecientes a la capa Youtube), que serían los más pesados a representar, analizando el tiempo (mediante timestamps) consumido en el proceso. Al encontrarnos en dos entornos diferentes este proceso es distinto en ambos casos, como describiremos a continuación en pseudocódigo:

  • ARviewer (Java/Android SDK): en este caso, el cálculo de los parámetros de cada nodo y su representación en pantalla se producen en distintos hilos de ejecución, por lo que calculamos los tiempos por separado y los sumamos al final.
public void onDatoBrujula(dato_brujula){
  TIC = System.currentTimeMillis();
  for(nodo in lista_nodos){
    datos_nodo = calculaDatos(nodo, datos_brujula);
    nodo.refrescaPosicion(datos_nodo);
  }
  TOC = System.currentTimeMillis();
  tiempo = TOC - TIC;
  for(nodo in lista_nodos){
    if(nodo.esVisible())
      tiempo += nodo.getTiempoComputo();
  }
}

Donde en el método refrescaPosicion() se llama al método invalidate() de Android, que indica al sistema que el recurso se debe volver a pintar. Cuando este decida pintar el recurso, invocará el método onDraw() del nodo en cuestión:

@Override
public void onDraw(...){
  TIC = System.currentTimeMillis();
  // Pintar el recurso
  TOC = System.currentTimeMillis();
  tiempoComputo = TOC - TIC;
}
  • ARviewer-PhoneGap (JavaScript): en este caso, todo el proceso se realiza en el mismo hilo de ejecución, por lo que la medición del tiempo puede hacerse de forma directa.
function onDatoBrujula(dato_brujula){
  TIC = System.currentTimeMillis();
  for(nodo in lista_nodos){
    datos_nodo = calculaDatos(nodo, datos_brujula);
    nodo.onDraw(datos_nodo);
  }
  TOC = System.currentTimeMillis();
  tiempo = TOC - TIC;
}

En la siguiente tabla podemos ver un resumen de los resultados obtenidos durante este análisis, donde se pueden apreciar las variaciones de rendimiento entre las dos plataformas en función del número de nodos visibles en la pantalla del terminal.

Aplicación Plataforma Nodos totales Nodos mostrados Tiempo de cómputo (ms)
ARviewer Java/Android 2.3.4 20 0 12
20 1 57.17
20 5 88.72
20 15 153.77
ARviewer-PhoneGap JavaScript/Android 2.3.4 20 0 13.1
20 1 16.58
20 5 20.0
20 15 45.1

Por último, veamos en esta tabla un desglose de los tiempos de cómputo medidos a la hora de parsear el archivo JSON, calcular los nuevos parámetros (azimut y elevación) y pintar los nodos en pantalla:

Aplicación Plataforma Nodos totales Nodos mostrados Parseo (ms) Cálculo de parámetros (ms) Pintado (ms) Total (sin parseo) (ms)
ARviewer Java/Android 2.3.4 20 0 126 12 0 12
20 1 126 14.05 41.85 55.9
20 5 126 2.78 85.94 88.72
20 15 126 2.85 150.15 153
ARviewer-PhoneGap JavaScript/Android 2.3.4 20 0 27 11.93 0 11.93
20 1 27 9.65 5.54 15.19
20 5 27 3.4 16.84 20.24
20 15 27 3.65 36.52 40.16