昨天我写了一个线程,解决了我的游戏循环如何运行(在java中)以及它是如何工作的。
我的游戏循环完全有效,我知道为什么,但现在我只是不知道如何计算 FPS(每秒帧数)并每秒打印出来。
我昨天收到了关于此事的回复,但他/她用语言解释了,我无法理解。
如果有人能帮助我(用一个代码示例?:D),那就太好了。
这是我的游戏循环:
while (running) {
start = System.nanoTime();
update();
draw();
drawToScreen();
elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;
if (wait < 0) {
wait = 5;
}
try {
Thread.sleep(wait);
} catch (Exception e) {
Game.logger.log("ERROR! Printing Stacktrace...");
e.printStackTrace();
}
}
也:
在我的 JFrame 中,当我调用 setName(字符串)时,它永远不会在框架上工作/更新 - 将我链接到线程?
最简单的方法是存储变量whatTheLastTimeWas
,并在要检查帧速率的位置执行此操作:
double fps = 1000000.0 / (lastTime - (lastTime = System.nanoTime())); //This way, lastTime is assigned and used at the same time.
或者,您可以像这样制作 FPS 计数器:
class FPSCounter extends Thread{
private long lastTime;
private double fps; //could be int or long for integer values
public void run(){
while (true){//lazy me, add a condition for an finishable thread
lastTime = System.nanoTime();
try{
Thread.sleep(1000); // longer than one frame
}
catch (InterruptedException e){
}
fps = 1000000000.0 / (System.nanoTime() - lastTime); //one second(nano) divided by amount of time it takes for one frame to finish
lastTime = System.nanoTime();
}
}
public double fps(){
return fps;
}
}
然后在您的游戏中,有一个FPSCounter
实例,并在一帧结束时调用nameOfInstance.interrupt();
。
您可以为此组合一个简单的计数器和 Timer.scheduleAtFixedRate。
免责声明:我不知道这是否是最好的方法;这很容易。
int totalFrameCount = 0;
TimerTask updateFPS = new TimerTask() {
public void run() {
// display current totalFrameCount - previous,
// OR
// display current totalFrameCount, then set
totalFrameCount = 0;
}
}
Timer t = new Timer();
t.scheduleAtFixedRate(updateFPS, 1000, 1000);
while (running) {
// your code
totalFrameCount++;
}