我正在尝试用FPS显示一个字符串,但是,我如何实际获得我的程序FPS呢?我想和你一起做
g.drawString(getFPS(), 10, 10)我如何获得我的FPS?
发布于 2011-05-09 04:42:28
这段代码为我做到了这一点。将其放入您的主程序循环中:
//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是我的画布)-您可以使用类似的方法为"g”类提供要绘制的正确framesCountAvg数据
发布于 2012-06-24 08:13:17
计算经过的时间,1000/elapsedTime将成为你的fps。
发布于 2014-01-03 00:55:43
虽然这个问题听起来有点模糊,但我还是会尽我所能回答它。由于最初的帖子可以追溯到2011年,那么OP很可能不会从我的回答中受益。希望它能为那些追随的人提供更好的基础(前面的两个答案看起来有点混乱和简洁)。
下面是我经常用来收集和显示各种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、文件等)。(附注:请注意,使用Swing,所有绘制操作都需要在事件分派器线程(EDT)上完成。因此,在不使用特殊命令(如SwingUtilities.invokeLater(..))的情况下,不应将绘制工作委托给其他(原始)线程。
希望这能有所帮助!
https://stackoverflow.com/questions/5930053
复制相似问题