如何在OpenGL ES(Android)中显示帧率?

5
我是一个新手,正在学习Java和OpenGL,对我的无知请见谅。我已经制作了一个APK文件。现在我想在应用程序播放时在设备上查看FPS。我一直在按照这个教程http://www.youtube.com/watch?v=1MYgP8Oj5RY&list=UUKwypsRGgHj1mrlQXhLXsvg&index=67进行尝试,在Android上进行修改,但我无法让它正常工作。
是否有人可以给我展示如何在角落或标题页上添加简单的FPS指示器以及如何控制FPS的例子?
谢谢
3个回答

8
如果您使用这个类并调用logFrame(),它会在logcat上以日志形式告诉您fps:
import android.util.Log;

public class FPSCounter {
    long startTime = System.nanoTime();
    int frames = 0;

    public void logFrame() {
        frames++;
        if(System.nanoTime() - startTime >= 1000000000) {
            Log.d("FPSCounter", "fps: " + frames);
            frames = 0;
            startTime = System.nanoTime();
        }
    }
}

从我所了解的来看,通过最小化调用gl状态来优化代码以获得更好的帧率。

这里是drawText()的链接


有没有一种方法可以将此与drawText()相结合,以便在glsurface上显示? - ihave2teeth

2
我知道现在已经很晚了,但这是谷歌的首选建议。因此,我想让它更好一些:
为什么要计算每秒帧数?在我的应用程序中,我需要实时获取FPS值(您也应该使用它)。到目前为止,我所知道的是:
Frames/Second

这意味着您可以测量相邻两帧之间的时间,并说:
Second/Frame

要获得FPS,只需简单地进行以下步骤:
1/(Second/Frame).

这里是代码。我使用了上面的代码并进行了编辑,以达到我的结果:

public class FPSCounter {
    private long lastFrame = System.nanoTime();
    public float FPS = 0;

    public void logFrame() {
        long time = (System.nanoTime() - lastFrame);
        FPS = 1/(time/1000000000.0f);
        lastFrame = System.nanoTime();
    }
}

0

主活动

import java.util.Timer;
import java.util.TimerTask;
....
....
public static int fps = 0;

protected void onCreate(...) {
        ....
   Timer timer = new Timer();
   timer.schedule(new TimerTask() {
      public void run() {
         fps();
      }
   },0,1000);
}

public void fps() {
   runOnUiThread(new Runnable() {
      public void run() {
         text.setText("FPS: " + fps);
         fps = 0;
      }
   });
}

渲染器方法 onDrawFrame()

MainActivity.fps++;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接