我偶然发现了一个问题,我并不能解决我也能理解。 我正在写使用Java 1.8.0_31用一个简单的2D游戏java.awt.Canvas
在Ubuntu 14.04。 问题是,我得到这个不堪闪烁(一个问题,我从来没有在Windows上),以确保我的代码是不是我写了一个小的测试程序与移动圆这个问题...
测试循环:
public void run() {
long startTime = System.currentTimeMillis();
long tick = 1000;
int fps = 0;
int upd = 0;
double nanoScale = 1000000000.0 / 60;
double delta = 0;
long lastTime = System.nanoTime();
while (running) {
long now = System.nanoTime();
delta += (System.nanoTime() - lastTime) / nanoScale;
lastTime = now;
while (delta > 1) {
update();
upd++;
delta--;
}
render();
fps++;
if (System.currentTimeMillis() - startTime > tick) {
window.setTitle(title + " || Fps: " + fps + " | Upd: " + upd);
fps = 0;
upd = 0;
tick += 1000;
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这给了我60了185-190 fps的速率仅受限制一个很好的和稳定的更新率Thread.sleep(5)
调用。
但是它看起来/感觉像FPS是令人难以置信的低(如同大多数帧掉下来),你就开始大呼小叫使用多个缓冲区现在前...
渲染方法:
public void render() {
BufferStrategy bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
Graphics2D g2d = (Graphics2D) bs.getDrawGraphics().create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.black);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(Color.red);
g2d.fillOval(x, y, 10, 10);
g2d.dispose();
bs.show();
}
奇怪的是使antialising暗示大大减少了闪烁,但不删除它。
我不能看到问题和抗锯齿之间的关系,开导我,如果有一个连接(我总是有Windows上的干净,光滑的结果,无论抗锯齿)。
所以我想的问题是:
什么可能导致问题的描述以及该用什么不能做到?
以防万一,这有助于我的显卡是gtx770和我使用的是NVIDIA二进制驱动-版本340.76 NVIDIA的-340(开源)