gpt4 book ai didi

java - 处理内存制作Swing动画

转载 作者:行者123 更新时间:2023-11-30 11:54:13 31 4
gpt4 key购买 nike

这是我第一次在那里写作,但是在阅读和搜索了很多关于我要解释的主题之后,我没有发现任何对我有用的东西(我已经查看了一个人的帖子,他解释了类似的事情iphone 应用程序,但没有最终解决方案)。对不起我的英语我会尽力而为嘿嘿:)。

好的,我开始了:我有一个 java 应用程序,它在 JPanel 上同时显示一组动画。这些动画是来自 Animation(继承自 JLabel)的 Java 对象,我自己的一个类,它存储一个 ImageIcon 数组(代表动画的帧)和一个整数指针,显示要绘制的实际框架(索引)。该类以这种方式覆盖了方法 setPaint():

@Override
public void paintComponent(Graphics g) {
g.drawImage(getImageAt(getCurrentIndex()).getImage(), getX2(), getY2(), getW(), getH(), null);
//getImage at retrieves the frame at a "index" position from frame array.
if (getCurrentIndex() < getTotal() - 1) {
incrementIndex();//increments frame by 1 (next frame)
} else {
resetIndex();//set index to 0 (frame 0)
}
}

另一方面,我们有 Display,它继承自 JPanel 并负责重新绘制面板(它使用 I javax.swing.Timer 对象并且每 50 毫秒重新绘制一次 ).

每个 Animation 对象的所有图像都具有相同的大小 768x576 和透明的 png 格式(因此我可以一次绘制许多动画)。

问题是,当我加载一个动画时,它占用了太多内存,因为它创建了我不知道为什么除了真正占用的 2MB 之外还有 200 MB 的“int”对象。当我加载更多动画时,JVM 的堆空间会激增(高达 1.7 GB...我不想再尝试 xD)。例如,6 个动画可能是 405 帧(平均为​​ 90)。我已经使用 JProfiler 收集了这些数据,但我无法发布捕获结果,所以这是我得到的: JProfiler 对我的应用程序的内存使用情况:

  • java.awtRectangle 3351 KB

  • sun.java2d.SunGraphics2D 16.510 KB(我认为这是所有动画和声音合乎逻辑的大小)。

  • java.lang.String 669KB

  • int[] 1337 MB...


在展示中,加载图片的过程是这样的:

add(new Animation (loadImageSet(Constants.DIR_CINTA_EJE,"all"),
Constants.A_CINTA_EJE, 75,-200,768,576));//1

DIR_CINTA_EJE 是该动画的所有帧所在的目录,值“all”表示我要加载所有帧。

有没有办法避免使用的内存随着动画的数量线性增长?为什么那些“int”值占那么多?它们是每张图片的像素吗?

是的,我已经将堆空间增加到 2GB,并且它可以正常工作,但成本很高。非常感谢您提供的所有帮助。我真的很喜欢这个论坛。

问候。

最佳答案

我一直在努力寻找一个令人满意的解决方案,终于找到了!这就是我所做的:

Animation 类不再继承自 JLabel,它只实现了 ActionListener,在其中 actionPerformed() 方法中,我增加了要为每个帧显示的帧(我使用 Timer 类)。因此,Animation 不再覆盖 paintComponent() 方法(它适用于 DisplayPanel)。

在 DisplayPanel 中,我使用了三个全局变量:

private BufferedImage _auxiliary_image;
private ImageIcon _image2display;
private ArrayList<Animation>;//I store there all the running animations there

现在,我在那里覆盖 DisplayPanel paintComponent(),因此:

 @Override
public void paintComponent(Graphics g){
super.paintComponent(g);
for (int i = 0; i < _animations.size(); i++) {
if(i==0){
_auxiliary_image.createGraphics().drawImage(_animations.get(i).getActual().getImage(), 0, 0, Color.white, null);
}else{
_auxiliary_image.createGraphics().drawImage(_animations.get(i).getActual().getImage(), 0, 0, null);
}

}
_image2display.setImage(_auxiliary_image);
_image2display.paintIcon(this, g, 50, -200);
}

我之所以区分两种情况,一种是 i==0,另一种是其余帧,是因为在绘画时我看到了黑色背景和动画的整个位置,所以我通过这种方式解决了这个问题.

现在,有 8 个 50 帧的动画,每个只占用 360 MB 的内存,而不是我上次得到的 1.3 GB =)(我只画了一张图像,这是由于合并所有要同时打印的帧的结果每个动画)。

谢谢,我希望这对您有所帮助!!!

关于java - 处理内存制作Swing动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826815/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com