《Java 2D游戏编程入门》—— 1.1 使用FrameRate类

简介: FrameRate类位于javagames.util包中。本书中所开发的工具代码都会放到这个工具包中,随后,我们将把这个包变成一个工具库。这个类用来测量本书中所开发的应用程序的每秒的帧数(frames per seconds,FPS)。

本节书摘来异步社区《Java 2D游戏编程入门》一书中的第1章,第1.1节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.1 使用FrameRate类

FrameRate类位于javagames.util包中。本书中所开发的工具代码都会放到这个工具包中,随后,我们将把这个包变成一个工具库。这个类用来测量本书中所开发的应用程序的每秒的帧数(frames per seconds,FPS)。FPS按照“FPS 100”的格式存储为一个字符串。每秒钟都会计算这个值。

在开始测量帧速率之前,需要先调用initialize()方法。这个方法把帧速率字符串初始化为0,并且把最近时间初始化为当前时间(以毫秒为单位)。

System.currentTimeMillis() 调用返回了从1970年1月1日午夜开始的毫秒数。不同的操作系统,测量时间的精度可能不同。例如,一些Windows版本只能保证10毫秒的精度。

对于每一个渲染的帧,都应该调用一次calculate()方法。要计算帧速率,从最近时间减去当前时间,并且将其存储到delta变量中。每一帧中帧计数都会增加,并且当delta时间超过一秒的时候,会产生新的FPS。delta变量很少确切地等于1秒钟,因此从delta变量减去1000毫秒,以略去额外的毫秒数。一旦保存了新的帧速率,就会重置帧计数并且再次开始处理。

package javagames.util;
public class FrameRate {
  private String frameRate; 
  private long lastTime;
  private long delta;
  private int frameCount;

  public void initialize() {
    lastTime = System.currentTimeMillis();
    frameRate = "FPS 0";
  }
  public void calculate() {
    long current = System.currentTimeMillis();
    delta += current - lastTime;
    lastTime = current;
    frameCount++;
    if( delta > 1000 ) {
      delta-= 1000;
      frameRate = String.format( "FPS %s", frameCount );
      frameCount = 0;
    }
  }
  public String getFrameRate() {
    return frameRate;
  }
相关文章
|
3天前
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
19 4
|
3天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
15 3
|
3天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
12 1
|
5天前
|
设计模式 算法 安全
Java多线程编程实战:从入门到精通
【4月更文挑战第30天】本文介绍了Java多线程编程的基础,包括线程概念、创建线程(继承`Thread`或实现`Runnable`)、线程生命周期。还讨论了线程同步与锁(同步代码块、`ReentrantLock`)、线程间通信(等待/通知、并发集合)以及实战技巧,如使用线程池、线程安全设计模式和避免死锁。性能优化方面,建议减少锁粒度和使用非阻塞算法。理解这些概念和技术对于编写高效、可靠的多线程程序至关重要。
|
5天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
5天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
15 1
|
6天前
|
Java
Java对象和类研究
Java对象和类研究
7 0
|
6天前
|
算法 Java 大数据
Java从入门到精通学习报告
Java从入门到精通学习报告
13 1
|
6天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
16 2
|
6天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用