【问题标题】:Rendering multiple Images efficently有效地渲染多个图像
【发布时间】: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


    【解决方案1】:

    首先

    将图像转换为设备兼容的颜色模型,因此无需即时转换...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2018-04-08
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多