帧率-做一个Android FPS计数器



我正在尝试为任何Android应用程序做一个FPS计数器。这意味着我没有该应用程序的源代码(我不能修改它或类似的东西,我只有。apk)。

我对此进行了大量研究,我发现只有一个应用程序可以做到这一点(它被称为Game Bench,你可以在Google Play上找到它),所以这是可能的。当应用程序启动时,它会列出你手机上的所有游戏,你选择一个,Game Bench会自动启动它并计算FPS。我需要一个类似的行为。

现在,我想问的是,你们中是否有人知道我如何计算一款应用的FPS(无需编写代码)。通过研究,我发现了一些模糊的方法,比如记录屏幕并计算视频的FPS,或者使用系统收集的数据来计算FPS。但是关于这两个"想法",网上的信息很少。

所以,如果你们有任何关于这件事的信息/想法/意见,我将很高兴听到他们。谢谢!

这是我如何使用表面视图来测试FPS的一个例子。看看Run方法,看看FPS是如何工作的。

1:我们获得更新之前的时间并呈现到屏幕上。

所有的工作做完之后,我们又得到了时间。

3: 1000毫秒是一秒,40 FPS是标准。

4: elaspedTime = startTime - endTime;

5:所以如果elaspedTime小于25,那么它至少做40 FPS。

6:如果elaspedTime = 5毫秒,那么它正在执行1000/5 = 200 FPS

7:如果你在同一个线程上运行更新程序和渲染程序,你可以让线程休眠几毫秒。这样你就不用更新很多次了。

8:希望它能有所帮助,这是一个基本的游戏类,保持游戏运行和40 fps,即使他们在Galaxy S 6上运行它。你会想要自己做必要的改变来调整它。

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

相关内容

  • 没有找到相关文章

最新更新