【发布时间】:2015-01-31 16:44:20
【问题描述】:
我正在制作一个游戏原型,我需要在屏幕上渲染大约 30 个 64x64 块。 通常我用 libgdx 做类似的事情,但这次我想使用原生 Java 方法。
对于一个示例测试,我加载了 10 个块并渲染它们 - 将我的 fps 从大约 300 降低到 35。 我这里的笔记本电脑有点坏,但我没想到他这么早就坏了。如果你可以看看我的代码并给我一些关于如何更有效地渲染的可能提示——那就太好了。我想我也没有 100% 掌握 BufferedImage 和 Graphics 的概念。
顺便说一句,我的规格是: * i5-2520M CPU @2.5GHZ(调试时负载约为 30%) * 4GB 内存 * 没有显卡
-----------------CODE----------------------------- ------------
图形和图像声明:
public BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
public Graphics2D g;
循环
while (running) {
long now = System.nanoTime();
unprocessed += (now - lastTime) / nsPerTick;
GraphicUtil.setDelta(now - lastTime);
lastTime = now;
boolean shouldRender = true;
while (unprocessed >= 1) {
ticks++;
gameTick();
unprocessed -= 1;
shouldRender = true;
}
if (shouldRender) {
frames++;
input.tick();
render();
}
if (System.currentTimeMillis() - lastTimer1 > 1000) {
lastTimer1 += 1000;
System.out.println(ticks + " ticks, " + frames + " fps");
frames = 0;
ticks = 0;
}
}
我的主循环中的 render() 方法
public void render() {
BufferStrategy bs = getBufferStrategy();
if(bs == null) {
createBufferStrategy(2);
return;
}
switch(currentScreenId) {
case Screen.MENUSCREENID :
menuScreen.handleInput();
menuScreen.render();
break;
case Screen.HOWTOSCREENID :
howToScreen.handleInput();
howToScreen.render();
break;
case Screen.GAMESCREENID :
gameScreen.handleInput();
gameScreen.render();
break;
}
Graphics g2 = bs.getDrawGraphics();
g2.drawImage(GraphicUtil.toCompatibleImage(image), 0, 0, getWidth(), getHeight(), null);
g2.dispose();
//
bs.show();
}
我的游戏画面中的 render() 方法
public void render() {
clearScreen(Color.BLACK);
//Render blocks
for(Block b : blocks.values()) {
game.g.drawImage(blockImage, (int) b.getBounds().x, (int) b.getBounds().y, blockImage.getWidth(null), blockImage.getHeight(null), null);
}
}
【问题讨论】:
标签: java image graphics render bufferedimage