在Ubuntu 14.04中闪烁的Java GUI

我偶然发现了一个我无法解决的问题,我也不能理解。 我在Ubuntu 14.04上用Java 1.8.0_31和java.awt.Canvas编写了一个简单的2D游戏。 问题是,我得到这个难以忍受的闪烁(我从来没有在Windows上的一个问题),以确保我的代码不是问题,我写了一个小animation循环的testing程序…

testing循环:

 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帧/秒的速率,这只受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暗示大大减less闪烁,但不能消除它。

我不能看到问题和抗锯齿之间的关系,如果有连接,我会启发我(无论抗锯齿,我总是在Windows上得到一个干净和平滑的结果)。

所以我想这个问题是:

什么可能会导致所描述的问题,以及可以做些什么呢?

以防万一这有助于我的显卡是GTX770 ,我使用NVIDIA二进制驱动程序 – 版本340.76 nvidia-340(开源)