Android Open Source - Cafe F P S Tracer






From Project

Back to project page Cafe.

License

The source code is released under:

Apache License

If you think the Android project Cafe listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2012 Baidu.com Inc/*  w w w.  java  2s.c  o  m*/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.baidu.cafe.local;

import java.util.ArrayList;

import android.view.View;
import android.view.ViewTreeObserver;

/**
 * @author ranfang@baidu.com, luxiaoyu01@baidu.com
 * @date 2012-9-17
 * @version
 * @todo
 */
class FPSTracer {
    private final static int INTERVAL      = 1000;
    private static long      mFpsStartTime = -1;
    private static long      mFpsPrevTime  = -1;
    private static int       mFpsNumFrames = 0;
    private static float     mTotalFps     = 0;
    private static int       mFpsCount     = 0;

    public static void trace(final LocalLib local) {
        final boolean threadDisable = true;
        new Thread(new Runnable() {

            @Override
            public void run() {
                int time = 0;
                ArrayList<View> decorViews = new ArrayList<View>();
                while (threadDisable) {
                    time++;
                    try {
                        Thread.sleep(INTERVAL);
                    } catch (InterruptedException e) {
                        // eat it
                    }

                    View[] windowDecorViews = local.getWindowDecorViews();
                    if (0 == windowDecorViews.length) {
                        continue;
                    }
                    View decorView = windowDecorViews[0];
                    if (!decorViews.contains(decorView)) {
                        print("add listener at " + decorView);
                        ViewTreeObserver observer = decorView.getViewTreeObserver();
                        observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

                            @Override
                            public boolean onPreDraw() {
                                countFPS();
                                return true;
                            }
                        });
                        decorViews.add(decorView);
                    }

                    // print fps average 1s
                    float averageFPS = 0 == mFpsCount ? 0 : mTotalFps / mFpsCount;
                    print(time + "s: " + averageFPS);
                    modifyFPS(-1);
                    modifyFPSCount(0);
                }
            }

        }, "trace").start();
    }

    private static void countFPS() {
        long nowTime = System.currentTimeMillis();
        if (mFpsStartTime < 0) {
            mFpsStartTime = mFpsPrevTime = nowTime;
            mFpsNumFrames = 0;
        } else {
            long frameTime = nowTime - mFpsPrevTime;
            //            print("Frame time:\t" + frameTime);
            mFpsPrevTime = nowTime;
            int interval = 1000;
            if (frameTime < interval) {
                float fps = (float) 1000 / frameTime;
                //                print("FPS:\t" + fps);
                modifyFPS(fps);
                modifyFPSCount(-1);
            } else {
                // discard frameTime > interval
            }
        }
    }

    /**
     * @param fps
     *            -1 means reset mFps to 0; otherwise means add fps to mFps
     */
    synchronized private static void modifyFPS(float fps) {
        if (-1 == fps) {
            mTotalFps = 0;
        } else {
            mTotalFps += fps;
        }
    }

    /**
     * @param count
     *            -1 means mFpsCount increase; otherwise means set mFpsCount to
     *            count
     */
    synchronized private static void modifyFPSCount(int count) {
        if (-1 == count) {
            mFpsCount++;
        } else {
            mFpsCount = count;
        }
    }

    private static void print(String msg) {
        if (Log.IS_DEBUG) {
            Log.i("FPS", msg);
        }
    }
}




Java Source Code List

com.baidu.cafe.CafeExceptionHandler.java
com.baidu.cafe.CafeListener.java
com.baidu.cafe.CafeServiceTestCase.java
com.baidu.cafe.CafeTestCase.java
com.baidu.cafe.CafeTestRunner.java
com.baidu.cafe.TearDownHelper.java
com.baidu.cafe.local.DESEncryption.java
com.baidu.cafe.local.FPSTracer.java
com.baidu.cafe.local.FileUtils.java
com.baidu.cafe.local.LocalLib.java
com.baidu.cafe.local.Log.java
com.baidu.cafe.local.NetworkUtils.java
com.baidu.cafe.local.SnapshotHelper.java
com.baidu.cafe.local.record.CafeWebViewClient.java
com.baidu.cafe.local.record.OutputEvent.java
com.baidu.cafe.local.record.ViewRecorderSDK.java
com.baidu.cafe.local.record.ViewRecorder.java
com.baidu.cafe.local.record.WebElementRecorder.java
com.baidu.cafe.local.traveler.APPTraveler.java
com.baidu.cafe.local.traveler.Logger.java
com.baidu.cafe.local.traveler.Operation.java
com.baidu.cafe.local.traveler.Util.java
com.baidu.cafe.local.traveler.ViewHelper.java
com.baidu.cafe.remote.ArmsBinder.java
com.baidu.cafe.remote.ArmsBootupReceiver.java
com.baidu.cafe.remote.Arms.java
com.baidu.cafe.remote.Armser.java
com.baidu.cafe.remote.BatteryState.java
com.baidu.cafe.remote.LockActivity.java
com.baidu.cafe.remote.Log.java
com.baidu.cafe.remote.MonkeyNetwork.java
com.baidu.cafe.remote.MyIntent.java
com.baidu.cafe.remote.SystemLib.java
com.baidu.cafe.remote.UILib.java
com.baidu.cafe.remote.ViewPropertyProvider.java
com.baidu.cafe.utils.CommandResult.java
com.baidu.cafe.utils.ReflectHelper.java
com.baidu.cafe.utils.ShellExecute.java
com.baidu.cafe.utils.Strings.java
com.baidu.cafe.utils.TreeNode.java