当前位置: 首页 > 知识库问答 >
问题:

Java 2D游戏绘图性能

房学文
2023-03-14

我在java中创建了一个2D游戏,并试图将其分辨率提高到60 fps,分辨率为1920x1080像素。我的游戏逻辑在不到1毫秒的时间内表现良好。但是绘图需要超过10毫秒。在我相当强大的台式机(英特尔i5-4670K@3.40Ghz)上这可能就足够了,但是在我的笔记本电脑(英特尔i5-6300HQ@2.30Ghz)上,游戏已经慢了很多。绘图分为两个主要步骤:

>

  • 将游戏的每个部分绘制到BuffereImage上

    在扩展的JPanel类中绘制BuffereImage

    相应的代码如下:

    @Override
    public void run() {
    
        init();
    
        long startTime;
        long elapsedTime;
        long waitTime;
    
        while(running) {
    
            startTime = System.nanoTime();
    
            update();
            long updateTime = (System.nanoTime() - startTime) / 1000000;
            draw();
            long drawTime = (System.nanoTime() - startTime) / 1000000;
            drawToScreen();
            long drawscreenTime = (System.nanoTime() - startTime) / 1000000;
    
            elapsedTime = System.nanoTime() - startTime;
            waitTime = targetTime - elapsedTime / 1000000;
            if(waitTime < 0) {
                waitTime = 0;
            }
    
            try {
                Thread.sleep(waitTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    public void init() {
    
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = env.getDefaultScreenDevice();
        GraphicsConfiguration config = device.getDefaultConfiguration();
        image = config.createCompatibleImage(1920, 1080, Transparency.TRANSLUCENT);
    
        g2d = (Graphics2D) image.getGraphics();
        running = true;
        gsm = new GameStateManager(this);
    }
    
    public void update() {
        gsm.update();
        Keys.update();
    }
    
    public void draw() {
        gsm.draw(g2d);
    }
    
    public void drawToScreen() {
        Graphics g = getGraphics();
        g.drawImage(image, 0, startDrawY, scaledWidth, scaledHeight, null);
        g.dispose();
    }
    

    draw和drawToScreen方法都需要5毫秒。在draw方法中,最慢的部分是绘制背景图像(1920x1080图像)和绘制关卡(由几个135x135图像组成),两者都需要几毫秒的时间。

    现在我有两个问题:对于这样的大图像,这种绘制速度正常吗?如果不是的话,我可能做错了什么,或者如何提高绘图性能?

  • 共有1个答案

    东郭宏朗
    2023-03-14

    Java的核心库不是用于高效的图形渲染,而是用于用户界面。JavaFX支持硬件加速。如果需要对图形进行微调,请参阅LWJGL或LibGDX。LibGDX具有更高级别的抽象,而LWJGL直接绑定到OpenGL、OpenGLES和Vulkan API。

    如果不想使用这些库,Java可以启用硬件加速。据我所知,它不是默认启用的。您需要向JVM添加以下参数:

    -Dsun。java2d。opengl=true

    如果您只是渲染一个图像,继续使用BufferedImage是可以的。但是,如果您经常编辑图像,请考虑使用VolatileImage来代替。

    这是关于我对加速Java2D游戏的了解程度。我建议大家看看这个问题。回答者似乎非常博学,在同一个话题上比我更深入。

     类似资料:
    • 我正在开发一个基于2D图块的游戏,其中所有图块旋转45度。 我想这样做: 原因是为了在2D游戏中创建不同的视角。 有相当多的基于瓷砖的游戏教程,但我不知道有像这样的旋转瓷砖。 所以我的问题是:如何创建旋转45度的瓷砖?我会感谢任何代码或链接。 编辑:忘了说我用的是Java Graphics2D,不是OpenGL

    • 我正在做一个2D平台,只是增加了重力 然而,如果空格键在玩家完成跳跃后仍然被按住,玩家就会在半空中继续跳跃。 我知道我需要检查球员是否真的在地面上,但当我这样做时,它总是返回“false”,如我的跳跃方法所述:

    • 问题内容: 我在Java2D方面表现有些古怪。我知道sun.java2d.opengl VM参数可以为2D启用3D加速,但是即使使用该参数也有一些奇怪的问题。 这是我运行的测试结果: 在JComponent上绘制具有32x32像素图块的25x18地图, 图像1 = .bmp格式,图像2 = .png格式 没有-Dsun.java2d.opengl = true 使用.BMP图像1的120 FPS使

    • 我正在克隆一只松鸡。我表现得很好:每秒60帧。当时它只有一根柱子/障碍物。我一加上3个,fps就降到了30及以下。那么游戏现在就不能玩了。我知道这与一直在做有关。 以下是代码: 完整的项目来源 还要记住这是真正的未抛光版本,所以代码很难看。我正在寻找提升性能的解决方案。 主类: 框架类别: 支柱/支柱类: Ptica/Brid等级: Util类:

    • 我们都知道MMO游戏的流行趋势。玩家面对面直播。 我关心的领域是玩家移动和游戏结果的存储。 通过NPGSQL适配器使用Csharp和PostgreSql v9.0 游戏客户端是基于浏览器的ASP.NET并调用所有与数据库相关的处理 为了理解我的查询,请考虑以下场景 我们将游戏进度存储在postgres表中。 例如,锦标赛从四名玩家开始,并遵循以下活动 < li >每个玩家从100点生命值开始 <

    • 我的问题是,我需要制作一个不断更新的GUI,因为我得到的值可以从数据库中更改,并且我在图形区域中遇到了一些问题。 我使用Graphics2D中的Drawline和Drawstring打印数据库中的值,这些字符串和线条移动并更改值,所以我需要调用repaint();使用计时器使它们出现在jpanel中,问题是repaint();不是在绘制之前移除背景中的旧绘画,而是当我完全调整所有更新的大小时。 我