Java 这个游戏循环中的FPS下降是多少?
有人能告诉我为什么FPS每几次迭代就从100(期望值)下降到91吗?在我的原始应用程序中,我尽可能简洁地使用了双缓冲和主动渲染,在这个示例中,同样的情况也会发生,但我使用被动渲染。FPS不断从100下降到91,我不知道为什么 代码Java 这个游戏循环中的FPS下降是多少?,java,class,rendering,Java,Class,Rendering,有人能告诉我为什么FPS每几次迭代就从100(期望值)下降到91吗?在我的原始应用程序中,我尽可能简洁地使用了双缓冲和主动渲染,在这个示例中,同样的情况也会发生,但我使用被动渲染。FPS不断从100下降到91,我不知道为什么 代码 另外,请不要编辑标题并将FPS拼错为FDS。您是否尝试分析代码以查看其速度减慢的地方?此外,不要使用getGraphics执行自定义绘制,这将在下次重绘管理器决定绘制组件时被清除,因为您是从线程执行的,可能会产生脏油漆^是的,我理解。我只是为了更快地证明我的问题。我在
另外,请不要编辑标题并将FPS拼错为FDS。您是否尝试分析代码以查看其速度减慢的地方?此外,不要使用
getGraphics
执行自定义绘制,这将在下次重绘管理器决定绘制组件时被清除,因为您是从线程执行的,可能会产生脏油漆^是的,我理解。我只是为了更快地证明我的问题。我在具有活动渲染的图像上使用getGraphics。我还没有尝试过评测,但我会试一试。如果睡眠时间过多,你永远不会重置睡眠时间
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
public class Test extends JPanel implements Runnable {
Image img;
int fps;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(img != null) {
g.drawImage(img, 0, 0, null);
}
}
public void gameUpdate() {
}
public void gameRender() {
Graphics g = getGraphics();
g.setColor(Color.BLACK);
for(int i = 0; i < 1000; i++)
g.fillRect(0, 0, 50, 50);
}
public void startGame() {
if(thread == null) {
thread = new Thread(this);
thread.start();
}
}
private Thread thread;
@Override
public void run() {
long beforeTime = 0;
long afterTime = 0;
long timeDiff = 0;
int period = 10000000;
long sleepTime = 0;
long overSleepTime = 0;
while(true) {
beforeTime = System.nanoTime();
gameUpdate();
gameRender();
repaint();
afterTime = System.nanoTime();
timeDiff = afterTime - beforeTime;
sleepTime = (period - timeDiff) - overSleepTime;
if(sleepTime > 0) {
try {
Thread.sleep(sleepTime/1000000L);
} catch (InterruptedException e){}
long threadSleepTime = System.nanoTime() - afterTime;
overSleepTime = threadSleepTime - sleepTime;
fps = (int)FPSCounter.getFPS(threadSleepTime, timeDiff);
System.out.println(fps);
} // end if
}
}
public void addNotify() {
super.addNotify();
startGame();
}
public static void main(String[] args) {
JFrame f = new JFrame("Title");
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new Test());
f.setVisible(true);
}
}
/**
* Return the current FPS
* @param threadSleep Amount of time thread has slept
* @param renderTime Amount of time took rendering/updating
* @return
*/
public static double getFPS(long threadSleep, long renderTime) {
return 1000000000 / (threadSleep + renderTime);
}