Java 高效地渲染多幅图像

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%的负载)

我正在制作一个游戏原型,需要在屏幕上渲染约30个64x64块。 通常我用libgdx做类似的事情,但这次我想使用原生Java方法

对于一个示例测试,我加载10个块并渲染它们——将fps从大约300降到35。 我这里的笔记本电脑有点坏,但我没想到他这么早就坏了。如果你能看看我的代码,给我一些关于如何更有效地渲染的提示,那就太好了。我猜我也没有100%掌握BuffereImage和Graphics的概念

顺便说一句,我的规格是: *i5-2520M CPU@2.5GHZ(调试时获得约30%的负载) *4GB内存 *没有Gpu

-----------------代码----------------------------------------

图形和图像声明:

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();
第二 如果块没有变化(即为背景),则在加载时将其绘制到
缓冲区图像
(缓冲区),然后将缓冲区绘制到
图形
上下文

我还鼓励您将要使用的
图形
上下文传递给
渲染器
方法,因为它在绘制时可能会更改