好吧,我正在做一个小游戏,我需要限制我的FPS,因为,当我在我真正快速的计算机上玩时,我有大约850 FPS,游戏将会变得非常快,而且当我切换到我的旧电脑,它变得更慢,所以我需要限制我的FPS才能做到这一点。我如何限制我的FPS? 我的主要游戏循环:
public void startGame(){
initialize();
while(true){
drawScreen();
drawBuffer();
plyMove();
//FPS counter
now=System.currentTimeMillis();
framesCount++;
if(now-framesTimer>1000){
framesTimer=now;
framesCountAvg=framesCount;
framesCount=0;
}
try{
Thread.sleep(14);
}catch(Exception ex){}
}
}
我如何绘制屏幕,并绘制所有其他东西,球员,球等。 这场比赛是重拍,顺便说一句。
public void drawBuffer(){
Graphics2D g = buffer.createGraphics();
g.setColor(Color.BLACK);
g.fillRect(0,0,600,500);
g.setColor(Color.GREEN);
g.fillRect(ply1.getX(),ply1.getY(),ply1.getWidth(),ply1.getHeight());
g.setColor(Color.RED);
g.fillRect(ply2.getX(),ply2.getY(),ply2.getWidth(),ply2.getHeight());
g.setColor(Color.WHITE);
g.fillOval(ball1.getX(),ball1.getY(),ball1.getWidth(),ball1.getHeight());
g.drawString("" + framesCountAvg,10,10);
}
public void drawScreen(){
Graphics2D g = (Graphics2D)this.getGraphics();
g.drawImage(buffer,0,0,this);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
答案 0 :(得分:4)
听起来你的显示器与游戏引擎相关联。确保两者断开连接。无论帧速率如何,您都希望游戏以相同的速度播放。如果您的快速计算机重新快速重新绘制屏幕,那么如果引擎导致游戏以恒定速度播放就可以。
答案 1 :(得分:2)
不要限制你的FPS,而是在fps很高的时候让游戏变得非常快。
据推测,您有代码可以在每个帧中执行某些操作,例如如果按下按钮,则向前移动角色。你要做的是将字符向前移动一定量,这取决于自上一帧以来经过的时间量。
答案 2 :(得分:1)
如上所述,你需要将你的显示循环与你游戏核心某处的更新循环分开,这可能是这样的
while (1)
{
drawscene();
update();
}
在更新中,您将时间提前一个固定的数量,例如0.17秒。如果您正好以60fps绘制,那么动画将实时运行,在850fps时,所有内容都将加速因子14(0.17 * 850)以防止这种情况,您应该使您的更新时间相关。例如
elapsed = 0;
while (1)
{
start = time();
update(elapsed);
drawscene();
sleep(sleeptime);
end = time();
elapsed = end - start;
}
答案 3 :(得分:0)
我在评论中的含义说明。你的方法plyMove();
里面我怀疑有类似
plyMove() {
ply1.x += amountX;
ply1.y += amountY;
}
而是根据经过的时间进行移动
plyMove(double timeElapsed) {
ply1.x += amountX * timeElapsed;
ply1.y += amountY * timeElapsed;
}
您可以根据主循环中的时差计算timeElapsed
,并相应地进行缩放以获得不错的移动。
double timePrev = System.currentTimeMillis();
while(true) {
double timeNow = System.currentTimeMillis();
double elapsed = timeNow - timePrev;
drawScreen();
drawBuffer();
plyMove(0.001 * elapsed);
timePrev = timeNow;
}
答案 4 :(得分:0)
如果你真的想要一个固定的时间帧游戏,你可以这样做:
float timer = 0;
float prevTime= System.currentTimeMillis();
while(true)
{
draw();
float currentTime = System.currentTimeMillis();
timer += currentTime - prevTime;
while (timer > UPDATE_TIME) // To make sure that it still works properly when drawing takes too long
{
timer -= UPDATE_TIME;
update();
}
}
其中UPDATE_TIME处于您想要以毫秒为单位更新的时间间隔。
答案 5 :(得分:-3)
一种方法是使用
try {
Thread.sleep(20);
} catch(InterruptedException e) {}
在主循环结束时。根据您的需要调整数量。