我尝试在模拟器中实现 FPS 算法时遇到了一些问题。一般的想法是我希望 60 是每秒最大的滴答渲染周期数。这是我的代码:
public void run() {
x = 0; //tick is set to 0 originally
lastT = System.currentTimeMillis(); //system time in milliseconds
//tick-render cycle
while(running == true){
currentT = System.currentTimeMillis();
deltaT += currentT - lastT;
lastT = currentT;
if(deltaT/tPerTick >= 1){
tick();
render();
deltaT = 0;
}
}
stop(); //stops thread when running =! true
}
常量 'tPerTick' 定义如下
double tPerTick = 1000 / 60
在我开发这个程序的整个过程中,我认为这个算法运行得很好,直到我跟踪这个算法来确认我发现了一个问题。每次循环循环(迭代?我不确定这里的正确词是什么)时,发现 if 语句为真,因此执行 tick-render 循环。我做了一些更多的跟踪(以找出发生这种情况的原因)并发现 deltaT 的值总是远远超过 tPerTick,就像远远超过(在某些情况下是 19 秒,尽管这显然不是这种情况)。我的代码中某处有错误吗?我认为我必须错误地使用 System.currentTimeMillis() 或错误地跟踪算法。
在实际模拟中它似乎工作正常(不知道为什么)。当我绘制图形时,我传递“x”(刻度)并将时间写入屏幕为 x/60 秒。
最佳答案
回答我自己的问题。
System.currentTimeMillis();
获取当前系统时间。如果您在 Debug模式下手动执行算法,“deltaT”将非常大,因为它将等于您手动跟踪算法所花费的时间。
关于java - 系统时间的 Fps 算法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36361414/