Java JLabel如何高效地显示动画gifs?

Java JLabel如何高效地显示动画gifs?,java,swing,jlabel,gif,Java,Swing,Jlabel,Gif,下面的代码让我可以显示10个大的gif图像,cpu性能大约为5% ImageIcon icon = new ImageIcon("target.gif"); JLabel jp = new JLabel(image); 如果我使用DhyanB()的openimaging库手动实现类似的函数,则会导致性能下降约一个数量级。 我查看了JLabel、ImageIcon和JComponent源代码,但找不到负责显示.gif文件的部分。 我想弄清楚这是怎么做的,看看我是否能在gif动画绘制之前进行一些有

下面的代码让我可以显示10个大的gif图像,cpu性能大约为5%

ImageIcon icon = new ImageIcon("target.gif");
JLabel jp = new JLabel(image);
如果我使用DhyanB()的openimaging库手动实现类似的函数,则会导致性能下降约一个数量级。 我查看了JLabel、ImageIcon和JComponent源代码,但找不到负责显示.gif文件的部分。 我想弄清楚这是怎么做的,看看我是否能在gif动画绘制之前进行一些有效的图像处理

GifImage gifImage = GifDecoder.read(new FileInputStream(f));
final int frameCount = gifImage.getFrameCount();

//Very basic gif playback
do{
    long lastUpdate = 0;

    for(int i = 0; i < frameCount; i++){
        BufferedImage frame = gifImage.getFrame(i);
        final int delay = (gifImage.getDelay(i))*10;

        //TODO Alpha masking and rescaling

        final long timePassedSinceLastFrame = (System.currentTimeMillis() - lastUpdate); //Change to nanao if necessary

        final long sleep =  delay - timePassedSinceLastFrame;

        if(sleep > 0)
            Thread.sleep(sleep);

        //Display

        targetImage = frame;
        self.repaint();
        lastUpdate = System.currentTimeMillis();
    }
}while(loop);


@Override
public void paintComponent(Graphics g){
    if(targetImage != null){
        g.drawImage(targetImage, 0, 0, null);
    }
}
GifImage GifImage=gifidecoder.read(新文件输入流(f));
final int frameCount=gifImage.getFrameCount();
//非常基本的gif播放
做{
long lastUpdate=0;
对于(int i=0;i0)
睡眠;
//展示
目标图像=帧;
self.repaint();
lastUpdate=System.currentTimeMillis();
}
}while(loop);
@凌驾
公共组件(图形g){
if(targetImage!=null){
g、 drawImage(targetImage,0,0,null);
}
}

您分析过您的代码吗?我敢打赌问题出在你的“非常基本的gif播放”上,它不会进行不必要的绘制。我没有分析它的深度,但为每帧调用一次重新绘制大约是我能做的最小绘制。这就是为什么我希望看一看负责在JLabels中显示gif文件的源代码。所以您根本没有分析它。当您可以分析源代码并找出CPU的使用情况时,查看源代码和猜测是没有用的。如果您以前没有使用过
jvisualvm
,现在也是学习这一点的好时机。“下面的代码让我可以显示10个大的gif图像,cpu性能大约为5%。”Swing GUI引擎非常聪明,只会渲染应用程序的一部分。这些都是可见的。因此,那些“10大gif图像”只能和屏幕分辨率一样大。除非GIF的帧速率高得离谱,否则它占用了现代CPU高达5%的空间,这让我感到惊讶。