有效渲染多个图像

时间:2014-12-03 07:51:20

标签: java image graphics render bufferedimage

我正在制作一个游戏原型,我需要在屏幕上渲染~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);
    }
}

1 个答案:

答案 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方法,因为它可能会在您绘画时发生变化。