【问题标题】:Doing an Android FPS counter做一个 Android FPS 计数器
【发布时间】:2015-05-29 15:30:32
【问题描述】:

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

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

现在,我要问的是,你们中是否有人至少知道我如何计算应用程序的 FPS(无需在其中编写代码)。做研究我发现了一些模糊的,比如记录屏幕并计算视频的 FPS,或者以某种方式使用 systrace 收集的数据来计算 FPS。但是关于这两个“想法”,互联网上的信息很少。

所以,如果你们对此事/想法/意见有任何信息,我会很高兴听到他们。谢谢!

【问题讨论】:

    标签: android frame-rate systrace screen-recording


    【解决方案1】:

    这是我如何使用 Surface View 调整 FPS 的示例。 查看 Run 方法以了解 FPS 的工作原理。

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

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

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

    4: elaspedTime = startTime - endTime;

    5:因此,如果 elaspedTime 小于 25,那么它至少可以达到 40 FPS。

    6:如果 elaspedTime = 5 毫秒,那么它的执行速度为 1000 / 5 = 200 FPS

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

    8:希望对您有所帮助 这个类是一个基本的游戏类,即使他们在 Galaxy S 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
        }
    }
    

    【讨论】:

    • 根据问题,他们没有源访问权限,并且正在寻找一种无需修改 APK 即可测量 FPS 的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2017-05-25
    • 2017-04-11
    相关资源
    最近更新 更多