我正在制作一个游戏原型,我需要在屏幕上渲染~30个64x64块。 通常我会使用libgdx做类似的事情,但这次我想使用本机Java方法。
对于样本测试,我加载10个块并渲染它们 - 将我的fps从大约300降低到35。 我在这里的笔记本电脑有点不好,但我没想到他这么早就崩溃了。如果您只是看看我的代码并给我一些关于如何更有效地渲染的提示 - 那将是很棒的。我想我也没有把握BufferedImage和Graphics 100%的概念。
不过,我的规格如下: * i5-2520M CPU @ 2.5GHZ(调试时负载约为30%) * 4GB Ram *没有Gpu----------------- 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();
}
我的gameScreen中的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);
}
}
答案 0 :(得分:0)
将图像转换为兼容的设备颜色模型,因此不需要动态转换...
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(width, height, image.getTransparency());
Graphics2D g2d = img.createGraphics();
g2d.drawImage(master, 0, 0, null);
g2d.dispose();
如果块没有改变(即背景),则在加载它们时将它们绘制到BufferedImage
(缓冲区),然后将缓冲区绘制到Graphics
上下文。
我还建议您将要使用的Graphics
上下文传递给renderer
方法,因为它可能会在您绘画时发生变化。