我想制作一个显示FPS的字符串,但是,我该如何获取程序的FPS? 我想用以下方法实现
g.drawString(getFPS(), 10, 10)
如何获取我的FPS?
我想制作一个显示FPS的字符串,但是,我该如何获取程序的FPS? 我想用以下方法实现
g.drawString(getFPS(), 10, 10)
如何获取我的FPS?
//To Measure FPS
private long now;
private int framesCount = 0;
private int framesCountAvg=0;
private long framesTimer=0;
//Main Game Loop
while (isRunning)
{
//Record the time before update and draw
long beforeTime = System.nanoTime();
//... Update program & draw program...
// DRAW FPS:
now=System.currentTimeMillis();
gEngine.drawFPS(c, framesCountAvg);
framesCount++;
if(now-framesTimer>1000)
{
framesTimer=now;
framesCountAvg=framesCount;
framesCount=0;
}}
调用"gEngine.drawFPS"只是告诉我的主要绘图方法在屏幕顶部包含fps(而c是我的Canvas)- 您可以使用类似的方法为您的"g"类提供正确的framesCountAvg数据来绘制
计算经过的时间,1000/elapsedTime
将是您的 fps。
虽然这个问题听起来有点模糊,但我会尽力回答。因为原帖是2011年发布的,所以发帖人可能无法从我的回答中受益。但希望对后来者有所帮助(前两个答案似乎有些混乱和简短)。
这里是一个代码片段,我经常用于收集和显示各种Java GUI应用程序的帧速率:
public class FrameRateCounter {
private Map<Long, Long> measurementTimes;
public FrameRateCounter() {
measurementTimes = new HashMap<Long, Long>();
}
public synchronized void submitReading() {
long measurementTime = System.nanoTime();
long invalidationTime = System.nanoTime() + 1000000000;
measurementTimes.put(measurementTime, invalidationTime);
}
public int getFrameRate() {
performInvalidations();
return measurementTimes.size();
}
private synchronized void performInvalidations() {
long currentTime = System.nanoTime();
Iterator<Long> i = measurementTimes.keySet().iterator();
while(i.hasNext()) {
long measurementTime = i.next();
long invalidationTime = measurementTimes.get(measurementTime);
if(invalidationTime < currentTime) {
i.remove();
}
}
}
}
相对于之前的解决方案,我的方法明显有以下优点:
Graphics
或JLabel
之类的内容即可。javax.Swing.Timer
或线程一起使用 - 在运行getFrameRate()
以获取结果时,在您尝试评估其性能的计时器/线程上调用submitReading()
(例如-您可以将其写入JLabel
、文件等)。SwingUtilities.invokeLater(..)
)的情况下,不应将任何绘图工作委托给其他(原始)线程。)