【发布时间】:2014-07-30 13:01:32
【问题描述】:
我的游戏引擎正在 JFrame 内的 Canvas 上绘制平铺地图。我正在使用 Bufferstrategy 来获得更平滑的渲染,并试图在程序内部的几个点上提高性能并最终得到 ca.每秒 120 帧以用黑色填充 1920 * 1080 窗口并在顶部绘制一些等距的 512 * 256 瓷砖。移动地图时,图块和 之间会出现小黑线。我假设它们发生是因为一些图块已经移动到新位置,但是当图像放在屏幕上时还没有完成。但我真的没有解决方案,我也不确定我是否正确。
我可能应该提到我在我的程序中使用了两个线程,一个线程调用更新和渲染方法,另一个线程当前只是获取用户输入以移动相机位置。此外,在某些 lauches 中一切正常,而在另一些中则闪烁非常糟糕。
下面是窗口创建和渲染的一些代码:
private final void createWindow(){
frame = new JFrame(title);
frame.setMinimumSize(size);
frame.setMaximumSize(size);
frame.setPreferredSize(size);
display = new Canvas();
display.setMinimumSize(size);
display.setMaximumSize(size);
display.setPreferredSize(size);
image = ImageLoader.boostPerformance(new BufferedImage((int)size.getWidth(), (int)size.getHeight(), BufferedImage.TYPE_INT_RGB));
graphics = (Graphics2D) image.getGraphics();
frame.add(display);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.requestFocusInWindow();
}
public final void renderToScreen(){
BufferStrategy bs = display.getBufferStrategy();
if(bs==null){
display.createBufferStrategy(bufferCount);
return;
}
graphicsToScreen = (Graphics2D) bs.getDrawGraphics();
graphicsToScreen.drawImage(image, 0, 0, display.getWidth(), display.getHeight(), null);
graphicsToScreen.dispose();
bs.show();
}
我使用其他类中的 Graphics2D 图形对象来绘制图块。
public void render(Graphics2D g) {
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
tilemap.render(g);
g.setColor(Color.red);
g.drawString(String.valueOf(Main.actualFps), 30, 30);
}
上面是使用我提到的图形对象的另一个类中的渲染方法。 在这里你可以看到瓦片地图的渲染方法:
private final void renderIsometric(Graphics2D g){
for(int x = 0; x < 4; x++){
for(int y = 3; y >= 0; y--){
if(x > tilesX - 1|| y > tilesY - 1)break;
if(x < 0 || y < 0)continue;
if(map[x][y] == null)continue;
g.drawImage(map[x][y].getImage(), (int)orthoToIso(x, y).x - cameraPosX, (int)orthoToIso(x, y).y - cameraPosY, null);
}
}
}
最后这里是确保 fps 计数器正常工作并且 120 fps 的值正确的主循环:
while(running){
long now = System.nanoTime();
double ns = 1000000000.0 / preferredUps;
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >= 1){
//call the update method
update();
updates++;
delta--;
}
//call the render method
render();
frames++;
//refresh the actualUps and actualFps once every second
if(System.currentTimeMillis() - timer > 1000){
timer+=1000;
actualUps = updates;
actualFps = frames;
updates = 0;
frames = 0;
}
}
如何摆脱这些微小的滞后和闪烁问题?此外,我一直想知道通过 LWJGL 而不是 Java2D 使用 OpenGL 是否会产生更好的结果?
感谢您的帮助!
【问题讨论】:
标签: java performance rendering