双缓冲区闪烁的Java小程序

双缓冲区闪烁的Java小程序,java,applet,Java,Applet,我正在做一个侧滚游戏。为了防止我的游戏中出现闪烁,我开始使用backbuffer以获得更平滑的图形。它修复了大多数问题,但是,如果我移动角色足够长的时间,屏幕就会开始闪烁。但它并没有详细说明如何确定这个垂直消隐间隔。我知道它实际上不是“闪烁”,而是在旧的基础上涂上新的更“撕裂”。有没有办法避免这种“撕裂” 谢谢 我会在评论中回答,但细节太多了。下面的代码几乎完全取自一个applet,在这个applet中,我必须以与现在相同的方式限制FPS(除了它是在mouseMove上,而不是按键) priva

我正在做一个侧滚游戏。为了防止我的游戏中出现闪烁,我开始使用backbuffer以获得更平滑的图形。它修复了大多数问题,但是,如果我移动角色足够长的时间,屏幕就会开始闪烁。但它并没有详细说明如何确定这个垂直消隐间隔。我知道它实际上不是“闪烁”,而是在旧的基础上涂上新的更“撕裂”。有没有办法避免这种“撕裂”


谢谢

我会在评论中回答,但细节太多了。下面的代码几乎完全取自一个applet,在这个applet中,我必须以与现在相同的方式限制FPS(除了它是在mouseMove上,而不是按键)

private long lastDrawTime=0;
按下公共无效键(按键事件e){
if(Calendar.getInstance().getTimeInMillis()-lastDrawTime<20)返回;
//在重画之前做任何需要做的事情
draw();
lastDrawTime=Calendar.getInstance().getTimeInMillis();
}

这里发生的是,有一个实例变量
lastdawtime
,它存储上次重画发生的时间。此变量与任何图形发生之前触发的按键事件的当前时间进行比较。如果时间差小于允许的间隔(在本例中为20毫秒或每秒50帧),则函数返回,不进行绘制或更新。但是,如果经过了足够的时间,所有正常操作都会完成,当前时间存储在变量中。

您需要实现一个独立于变量FPS的恒定游戏速度。详细说明如何重新绘制。

何时重新绘制?持续循环,还是当用户移动角色时?这纯粹是基于这样一个事实的推测,即只在长时间移动角色时才会发生,但如果在keypress函数中重画,每秒帧数没有任何限制,因为keypress事件触发得非常快,它可能会慢慢地越来越落后,直到最后开始撕裂。回答我自己的问题。这个链接很有用,谢谢!这比我找到的方法简单得多。你找到的文章实际上非常有用。这个答案对于当前只需要在用户输入时更新的环境很有用,但是一旦你开始添加其他东西,比如独立于玩家移动的敌人,你最好使用本文中描述的方法。
private long lastDrawTime = 0;

public void keyPressed(KeyEvent e) {
    if (Calendar.getInstance().getTimeInMillis() - lastDrawTime < 20) return;
    //do whatever needs to be done before redrawing
    draw();
    lastDrawTime = Calendar.getInstance().getTimeInMillis();
}