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

在java中加载图像后FPS下降

仰翔
2023-03-14

所以,我最近问了一个关于如何在Java中预加载图像的问题(在Java中预加载图像),它工作得很好!直到我去玩游戏。Framerate急剧下降。我不知道它是什么,但基本上,我有一个完整的雪碧地图加载到一个数组。每个图像对应于三度旋转。因此,5度将变成3度图像,6度将保持6度,以此类推(我试过Math.Round,它实际上使5度和4度图像变成6度图像,这更理想,但是,它更慢)
我正在寻找一些方法来优化代码。以下是我的角度计算:

private float getAngle(double x, double y) {
    float angle = (float) Math.toDegrees(Math.atan2(y - this.getCenterY(), x - this.getCenterX()));
    if(angle < 0){
        angle += 360;
    }
    return angle;
}

输入到方法中的x和y值是执行此计算的塔所针对的敌人的中心x和y值。然后在draw方法中执行此代码:

if(airID==Value.towerCannon && (airRow>0 && airRow<5) && angle>=0) {
    if(angle==Canvas.rotatedAirMap.length) angle = 0;
        g.drawImage(Canvas.rotatedAirMap[angle][level-1], x, y, width, height, null); 
    } else {
        g.drawImage(Canvas.airMap[airRow][airID], x, y, width, height, null); 
    }
}

这将绘制适当的、以指定角度旋转的预加载图像(“角度”--或图像标识符--是在塔拍摄时通过将角度计算的结果除以3来计算的,然后将其转换为int--我也可以将该值四舍五入)
关于如何优化这一点以避免如此大规模的帧下降有什么建议吗?我假设帧丢失是由于VM堆大小太小,但我已经增加了它,仍然没有发生任何重要的事情。任何帮助都将不胜感激。
谢谢!

@vgr以下是我对您的回复所做的处理:

public void paintComponent(Graphics g) {
    if(isFirst) { //Define stuff when isFirst is true
        define(); //Sets up the image arrays

        GraphicsConfiguration config = getGraphicsConfiguration();
        if(config == null) {
            GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
            config = env.getDefaultScreenDevice().getDefaultConfiguration();
        }

        BufferedImage compatibleImage = config.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency());

        g = compatibleImage.createGraphics();

        isFirst = false;
    }
}

这有点快,但我必须做一些变通办法。repaint()是在游戏循环中调用的(这个类实现了runnable),所以由repaint方法创建的图形组件(不管它如何工作)就是我在整个游戏中使用的图形。这是正确的做法吗?

共有1个答案

段干宏硕
2023-03-14

将图像从其固有的颜色模型转换为当前视频模式的颜色模型可以降低渲染速度。为了避免这种情况,您可以确保每个图像与窗口所在的屏幕兼容:

BufferedImage image = ImageIO.read(/* ... */);

GraphicsConfiguration config = getGraphicsConfiguration();
if (config == null) {
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment;
    config = env.getDefaultScreenDevice().getDefaultConfiguration();
}

BufferedImage compatibleImage = config.createCompatibleImage(
    image.getWidth(), image.getHeight(), image.getTransparency());

Graphics2D g = compatibleImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();

image = compatibleImage;

如果图像具有与当前视频模式相同的颜色模型,则绘制时不需要平移。甚至有可能绘制这样的图像可能完全由GPU完成。

 类似资料:
  • 问题内容: 当我尝试在applet浏览器中运行applet时,无法找到资源(图像)。我尝试像这样加载资源: 但是当我在appet查看器中运行它时,路径是这样的:imgPath:file:D:/Work/app/build/classes/com/blah/Images/a.png 虽然此路径中有图像,但前缀文件是:导致问题,我该如何测试此代码? 当部署在服务器中并且代码库返回服务器URL时,此代码

  • 问题内容: 我想从我的应用程序中的URL加载图像,因此我首先尝试使用Objective-C,但是它可以正常工作,但是对于Swift,我遇到了编译错误: ‘imageWithData’不可用:使用对象构造’UIImage(data :)’ 我的功能: 在Objective-C中: 有人可以解释一下为什么Swift无法使用它,以及如何解决该问题。 问题答案: Xcode 8或更高版本•Swift 3或

  • 我想做一个reactjs页面懒惰加载图像。因此,我调用lazyLoadImages()内部的组件didMount()。我发现位于浏览器选项卡的浏览器加载指示器仍然一路旋转,直到加载所有图像。这让我认为我所做的并没有提供真正的懒惰加载图像体验。 有趣的是,如果我在setTimeout中用一个不太短的timeout参数包装lazyLoadImages(),例如100ms(不是0或甚至50ms),那么页

  • 下面是我的代码: 只是一个加载图像的文件。 我得到以下错误: 以下是完整的代码:

  • 问题内容: 我需要以简单的Java独立应用程序从Web加载图像。有任何想法吗? 问题答案: 这足以启动您吗?不知道您要从那里做什么。

  • 我有回家的路线。在这个主路由中,我使用Jimp库来处理图像,调整它的大小,然后更改质量,最后将图像保存在目录中,但我想下载图像,以便用户可以在他的机器上下载。但它没有下载。我正确地保存在名为output.jpg的目录中。这是密码 app.get(“/”,(req,res)=>{ res.type(“jpg”);RES.Attachment(“output.jpg”) jimp.read('lenn