Java 高效地渲染多幅图像
我正在制作一个游戏原型,需要在屏幕上渲染约30个64x64块。 通常我用libgdx做类似的事情,但这次我想使用原生Java方法 对于一个示例测试,我加载10个块并渲染它们——将fps从大约300降到35。 我这里的笔记本电脑有点坏,但我没想到他这么早就坏了。如果你能看看我的代码,给我一些关于如何更有效地渲染的提示,那就太好了。我猜我也没有100%掌握BuffereImage和Graphics的概念 顺便说一句,我的规格是: *i5-2520M CPU@2.5GHZ(调试时获得约30%的负载) *4GB内存 *没有Gpu -----------------代码---------------------------------------- 图形和图像声明:Java 高效地渲染多幅图像,java,image,graphics,render,bufferedimage,Java,Image,Graphics,Render,Bufferedimage,我正在制作一个游戏原型,需要在屏幕上渲染约30个64x64块。 通常我用libgdx做类似的事情,但这次我想使用原生Java方法 对于一个示例测试,我加载10个块并渲染它们——将fps从大约300降到35。 我这里的笔记本电脑有点坏,但我没想到他这么早就坏了。如果你能看看我的代码,给我一些关于如何更有效地渲染的提示,那就太好了。我猜我也没有100%掌握BuffereImage和Graphics的概念 顺便说一句,我的规格是: *i5-2520M CPU@2.5GHZ(调试时获得约30%的负载)
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);
}
}
第一
将图像转换为设备的兼容颜色模型,这样它们就不需要动态转换
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();
第二
如果块没有变化(即为背景),则在加载时将其绘制到缓冲区图像
(缓冲区),然后将缓冲区绘制到图形
上下文
我还鼓励您将要使用的图形
上下文传递给渲染器
方法,因为它在绘制时可能会更改