首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >做FPS淋浴?

做FPS淋浴?
EN

Stack Overflow用户
提问于 2011-05-09 04:14:06
回答 3查看 6K关注 0票数 3

我正在尝试用FPS显示一个字符串,但是,我如何实际获得我的程序FPS呢?我想和你一起做

代码语言:javascript
复制
g.drawString(getFPS(), 10, 10)

我如何获得我的FPS?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-09 04:42:28

这段代码为我做到了这一点。将其放入您的主程序循环中:

代码语言:javascript
复制
//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数据

票数 9
EN

Stack Overflow用户

发布于 2012-06-24 08:13:17

计算经过的时间,1000/elapsedTime将成为你的fps。

票数 2
EN

Stack Overflow用户

发布于 2014-01-03 00:55:43

虽然这个问题听起来有点模糊,但我还是会尽我所能回答它。由于最初的帖子可以追溯到2011年,那么OP很可能不会从我的回答中受益。希望它能为那些追随的人提供更好的基础(前面的两个答案看起来有点混乱和简洁)。

下面是我经常用来收集和显示各种Java GUI应用程序帧率的代码片段:

代码语言:javascript
复制
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();
            }
        }
    }
}

我的方法(相对于前面的解决方案)的明显优势是:

  1. 关注点分离-你不希望像FPS计数这样的琐碎事情污染你程序的“主循环”。因此,将此逻辑隔离到图形用户界面组件框架的单独component/class.
  2. Independence中-最好是尽可能避免依赖于框架的解决方案。在目前的情况下,这很容易-只要避免在计算中引用GraphicsJLabel之类的东西,你就很好了。
  3. 所有存储在哈希图中的度量-哈希图以其快速查找时间而闻名(时间复杂度几乎为O(1))。因此,进行必要的比较应该不会对application.
  4. Can的整体性能有任何明显的影响-在多个javax.Swing.Timer或线程中使用-在从另一个计时器/线程运行getFrameRate()以获得结果时,对您试图评估其性能的计时器/线程调用submitReading() (例如,您可以将其写入JLabel、文件等)。

(附注:请注意,使用Swing,所有绘制操作都需要在事件分派器线程(EDT)上完成。因此,在不使用特殊命令(如SwingUtilities.invokeLater(..))的情况下,不应将绘制工作委托给其他(原始)线程。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5930053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档