计算帧率的基本公式是:
\[ \text{fps} = \frac{\text{frameNum}}{\text{elapsedTime}} \]
其中:
`frameNum` 是在一定时间内的帧数。
`elapsedTime` 是从开始到当前时间的时间间隔。
方法一:固定时间帧数法
在这种方法中,我们记录在固定时间间隔内的帧数,然后除以这个时间间隔来计算帧率。以下是一个简单的示例代码:
```c
int fps() {
static int fps = 0;
static int lastTime = getTime(); // ms
static int frameCount = 0;
++frameCount;
int curTime = getTime();
if (curTime - lastTime > 1000) { // 取固定时间间隔为1秒
fps = frameCount;
frameCount = 0;
lastTime = curTime;
}
return fps;
}
```
方法二:固定帧数时间法
在这种方法中,我们记录在固定帧数的情况下经过的时间,然后除以帧数来计算帧率。以下是一个简单的示例代码:
```c
int fps(int deltaTime) {
static int fps = 0;
static int timeLeft = 1000; // 取固定时间间隔为1秒
static int frameCount = 0;
++frameCount;
timeLeft -= deltaTime;
if (timeLeft < 0) {
fps = frameCount;
frameCount = 0;
timeLeft = 1000;
}
return fps;
}
```
方法三:使用 `requestAnimationFrame`
`requestAnimationFrame` 是一个浏览器提供的API,用于在每一帧动画之前调用指定的回调函数。通过计算回调函数调用的间隔时间,我们可以计算出帧率。以下是一个简单的示例代码:
```javascript
var calculateFPS = (function() {
var lastTime = 0;
var fps = 0;
var count = 0;
var callback;
return function calcFPS() {
if (count++ === 100) {
calcFPS.callback(fps);
}
var now = +(new Date());
var newFps = 1000 / (now - lastTime);
lastTime = now;
if (!fps) {
fps = newFps;
requestAnimationFrame(calcFPS);
} else {
if (Math.abs(fps - newFps) > 0.1) {
console.log(fps);
}
calculateFPS()
}
};
})();
```
方法四:使用 `Time.realtimeSinceStartup`
在Unity等游戏引擎中,我们可以使用 `Time.realtimeSinceStartup` 来获取当前时间,并在每一帧更新帧率。以下是一个简单的示例代码:
```csharp
const float fpsMeasurePeriod = 0.5f; // 固定时间为0.5s
private int m_FpsAccumulator = 0;
private float m_FpsNextPeriod = 0;
private int m_CurrentFps;
private void Start() {
m_FpsNextPeriod = Time.realtimeSinceStartup + fpsMeasurePeriod; // 下一次刷新时间
}
private void Update() {
m_FpsAccumulator++;
if (Time.realtimeSinceStartup > m_FpsNextPeriod) {
m_CurrentFps = (int)(m_FpsAccumulator / fpsMeasurePeriod);
m_FpsAccumulator = 0;
Debug.Log(m_CurrentFps + " FPS");
m_FpsNextPeriod = Time.realtimeSinceStartup + fpsMeasurePeriod;
}
}
```
方法五:使用视频处理库
对于视频处理,我们可以使用一些视频处理库(如OpenCV)来读取视频帧,并计算帧率。以下是一个简单的示例代码: