2011-07-21 17 views

Respuesta

2

No sé sobre el cálculo de FPS (supongo que debe hacerse en todo el sistema y no se calcula por vista), pero puede usar Hierarchy Viewer para perfilar el rendimiento de cada View. Le da el tiempo necesario para medir, calcular el diseño y dibujar cada View en milisegundos, y le ayuda a encontrar objetos lentos View mostrando círculos amarillos y rojos que indican un mal rendimiento.

0

Puede que le interese este ListAdapter, que incluirá otro ListAdapter e imprimirá las declaraciones de registro sobre cuántas visualizaciones se muestran por segundo.

import android.database.DataSetObserver; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListAdapter; 

public class VpsAdapter implements ListAdapter { 
    protected int vpsViewCount = 0; 
    protected long vpsStartTimeNanos = System.nanoTime(); 
    protected ListAdapter delegate; 

    public VpsAdapter(ListAdapter delegate) { 
     super(); 
     this.delegate = delegate; 
    } 

    public void resetViewsPerSecond() { 
     vpsViewCount = 0; 
     vpsStartTimeNanos = System.nanoTime(); 
    } 

    public double getViewsPerSecond() { 
     final long now = System.nanoTime(); 
     return (vpsViewCount/(double)(now - vpsStartTimeNanos)) * 1e9; 
    } 

    public int getViewsPerSecondViewCount() { 
     return vpsViewCount; 
    } 

    @Override 
    public boolean areAllItemsEnabled() { 
     return delegate.areAllItemsEnabled(); 
    } 

    @Override 
    public int getCount() { 
     return delegate.getCount(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return delegate.getItem(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return delegate.getItemId(i); 
    } 

    @Override 
    public int getItemViewType(int i) { 
     return delegate.getItemViewType(i); 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     ++vpsViewCount; 
     Log.d("VpsAdapter", String.format("VpsAdapter: %.2f views per second (%s views)", getViewsPerSecond(), getViewsPerSecondViewCount())); 
     return delegate.getView(i, view, viewGroup); 
    } 

    @Override 
    public int getViewTypeCount() { 
     return delegate.getViewTypeCount(); 
    } 

    @Override 
    public boolean hasStableIds() { 
     return delegate.hasStableIds(); 
    } 

    @Override 
    public boolean isEmpty() { 
     return delegate.isEmpty(); 
    } 

    @Override 
    public boolean isEnabled(int i) { 
     return delegate.isEnabled(i); 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver dataSetObserver) { 
     delegate.registerDataSetObserver(dataSetObserver); 
    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver dataSetObserver) { 
     delegate.unregisterDataSetObserver(dataSetObserver); 
    } 
} 

de usar, basta envolver su ListAdapter existente en un VpsAdapter, por ejemplo.

setListAdapter(new VpsAdapter(myAdapter)); 

A continuación, llame resetViewsPerSecond() cuando esté listo para iniciar el cronometraje, y getViewsPerSecond() cuando esté listo para recuperar el resultado. El adaptador también registrará en la consola los vps actuales para cada llamada al getView().

Uso este adaptador junto con ListView.smoothScrollTo(adapter.getCount()-1) para desplazarme programáticamente por la vista de lista hacia abajo y obtener el promedio de vps.

Cuestiones relacionadas