代码之家  ›  专栏  ›  技术社区  ›  Miles

如何使用compatibleImage在java2D中更快地绘制图像?

  •  0
  • Miles  · 技术社区  · 9 年前

    我正在用Java2D编写一个游戏,它在我的电脑和我测试过的另一台电脑上运行得很流畅。然而,在另一台计算机上,它的规格和java设置都很不错,速度非常慢。我很确定我把它缩小到了g.drawImage()命令。在做了一些研究之后,我发现有人制作了一种方法,将一些他认为可以提高速度的东西汇编起来,该方法是:

    public BufferedImage toCompatibleImage(BufferedImage image) {
        // obtain the current system graphical settings
        GraphicsConfiguration gfx_config = GraphicsEnvironment
                .getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration();
    
    
    
         //if image is already compatible and optimized for current system
         //settings, simply return it
    
        if (image.getColorModel().equals(gfx_config.getColorModel())) {
    
            return image;
        }
    
        // image is not optimized, so create a new image that is
        BufferedImage new_image = gfx_config.createCompatibleImage(
                image.getWidth(), image.getHeight(), Transparency.TRANSLUCENT);
    
        // get the graphics context of the new image to draw the old image on
        Graphics2D g2d = (Graphics2D) new_image.getGraphics();
    
        // actually draw the image and dispose of context no longer needed
        g2d.drawImage(image, 0, 0, null);
        g2d.dispose();
    
        // return the new optimized image
        // System.out.println(image.getColorModel());
        return new_image;
    }
    

    我很困惑你怎么用这个方法。我做到了: 1) 仅在使用image.IO从png创建图像时调用它。

    BufferedImage img = toCompatibleImage(theLoadedImage);
    

    然后在paintComponent(Graphics g)方法中调用

     Graphics2D g2 = (Graphics2D) g;
     g.drawImage(img, x, y, null); 
    

    2) 在每次重新绘制时调用它,如下所示:

     Graphics2D g2 = (Graphics2D) g;
     g.drawImage(toCompatibleImage(theLoadedImage), x, y, null);
    

    这两种方法除了FPS的名义变化外,似乎没有什么作用,第一种方法稍快一些。我不知道我是否正确使用了这一点,所以帮助和基本解释将非常有用。

    1 回复  |  直到 9 年前
        1
  •  1
  •   lbalazscs    9 年前

    您应该使用第一种方法,只需转换一次即可。

    兼容的图像以与视频卡相同的格式在内部存储像素,因此不必每次绘制时都进行转换。