做一个Android FPS计数器(Doing an Android FPS counter)

2019-10-23 05:18发布

我试图做任何Android应用程序的FPS计数器。 这意味着我不必为应用程序的源代码(我不能修改或类似的东西,我只是有.apk文件)。

我已经研究了很多这个,我发现只有一个应用程序,这是否(这就是所谓的游戏台,你可以找到它的谷歌游戏),所以有可能以某种方式。 当应用程序启动时,它已与所有手机上的游戏列表,你选择一个和游戏台自动启动并计算FPS。 我需要一个类似的行为。

现在,我问的是,如果你们有至少我怎么能计算应用的FPS(不含在里面编写代码)的想法。 做研究,我发现了一些模糊的,如记录屏幕,并与systrace收集的数据计算FPS视频,或以某种方式计算FPS。 但在这两个“意见”有在互联网上很少的信息。

所以,请,如果你们有这件事/创意/意见的任何信息,我会很高兴听到他们的声音。 谢谢!

Answer 1:

这是我会怎么板凳FPS使用从表面上看的一个例子。 看看Run方法看FPS如何工作的。

1:我们更新之前获得的时间和渲染到屏幕上。

2:所有的工作完成后,我们再次得到了时间。

3:1000毫秒是第二和40 FPS是常态。

4:elaspedTime =开始时间 - 结束时间;

5:所以,如果elaspedTime是25岁以下则其在-至少做40 FPS。

6:如果elaspedTime = 5毫秒,则其操作的方式5分之1000= 200 FPS

7:你可以睡上几毫秒的线程,如果你正在运行在同一线程上的更新和渲染。 你不更新很多次这样的话。

8:希望它可以帮助这个类是基本的游戏类,保持游戏的运行,即使他们是在一个星系运行IT方面6.你想使自己的必要修改,以更调整它40个FPS。

public class MySurfaceView extends SurfaceView implements Runnable {
    long time = 0, nextGameTick = 0;
    SurfaceHolder myHolder;
    Thread myThread = null;
    boolean myRunning = false;

    public MySurfaceView(Context context) {
        super(context);
        myHolder = getHolder();
    }

    @Override
    public void run() {
        while (myRunning) {
            nextGameTick = System.currentTimeMillis();
            if (!myHolder.getSurface().isValid())
                continue;
            Update();
            Render();
            time = nextGameTick - System.currentTimeMillis();
            time = (time <= 0) ? 1 : time;
            if (time <= 25)
                sleepThread(25 - time);
            Log.d("FrameRate", String.valueOf(1000 / time));
        }
    }

    public void pause() {
        myRunning = false;
        while (true) {
            try {
                myThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        myThread = null;
    }

    public void resume() {
        myRunning = true;
        myThread = new Thread(this);
        myThread.start();
    }

    public void sleepThread(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void Render() {
        // TODO Render to Screen
    }

    private void Update() {
        // TODO Update
    }
}


文章来源: Doing an Android FPS counter