2011-07-21 2 views

ответ

2

Я не знаю о вычислении FPS (я думаю, это должно быть сделано в масштабах всей системы и не рассчитано для каждого вида), но вы можете использовать Hierarchy Viewer для характеристики каждого из View. Это дает вам время, необходимое для измерения, расчета макета и рисования каждого View в миллисекундах, а также позволяет найти медленные объекты View, показывая желтые и красные круги, указывающие на плохую производительность.

0

Возможно, вас заинтересует этот ListAdapter, который перенесет другой ListAdapter и распечатает заявления журнала о том, сколько просмотров было отображено в секунду.

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); 
    } 
} 

Чтобы использовать, просто оберните существующий ListAdapter в VpsAdapter, например.

setListAdapter(new VpsAdapter(myAdapter)); 

Затем вызовите resetViewsPerSecond(), когда вы будете готовы начать синхронизацию, и getViewsPerSecond(), когда вы будете готовы, чтобы получить результат. Адаптер также запустит на консоль текущий vps для каждого звонка до getView().

Я использую этот адаптер в сочетании с ListView.smoothScrollTo(adapter.getCount()-1), чтобы программно прокрутить список вниз и получить среднее значение vps.

Смежные вопросы