2

I have a third party framework that shows video on a SurfaceView. I would like to measure the framerate of the video to check if the phone is capable of showing the video fast enough, or if I need to use another solution to show the information to the user.

How can I measure the speed with that a SurfaceView is updated?

Janusz
  • 187,060
  • 113
  • 301
  • 369
  • This answer might help.. http://stackoverflow.com/questions/13498184/editing-android-videoview-frames/13667582 Override the draw method.. – Ron Dec 04 '12 at 15:54

2 Answers2

13

If the code is not clear just ask.

LinkedList<Long> times = new LinkedList<Long>(){{
    add(System.nanoTime());
}};

@Override
protected void onDraw(Canvas canvas) {
    double fps = fps();
    // ...
    super.onDraw(canvas);
}

private final int MAX_SIZE = 100;
private final double NANOS = 1000000000.0;

/** Calculates and returns frames per second */
private double fps() {
    long lastTime = System.nanoTime();
    double difference = (lastTime - times.getFirst()) / NANOS;
    times.addLast(lastTime);
    int size = times.size();
    if (size > MAX_SIZE) {
        times.removeFirst();
    }
    return difference > 0 ? times.size() / difference : 0.0;
}
Marek Sebera
  • 39,650
  • 37
  • 158
  • 244
pawelzieba
  • 16,082
  • 3
  • 46
  • 72
5

try this!

private long mLastTime = 0;
private int fps = 0, ifps = 0;
@Override
protected void onDraw(Canvas canvas) {
    long now = System.currentTimeMillis();

    // perform other operations

    System.out.println("FPS:" + fps);

    ifps++;
    if(now > (mLastTime + 1000)) {
        mLastTime = now;
        fps = ifps;
    ifps = 0;
    }
}
Asif Mujteba
  • 4,596
  • 2
  • 22
  • 38