Java-апплет заикается при первом рисовании BufferedImage (Java2D) - PullRequest
0 голосов
/ 20 марта 2012

Я пишу игру в виде Java-апплета с использованием библиотек Java2D вместе с классом BufferedImage.Игра заикается (2-3 секунды) при первом рисовании изображения.Все файлы BufferImage загружаются до начала игры, используя этот метод:

bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);       
    try {
           URL url = new URL(a.getCodeBase(), "images//smoke5frames.png");
           bufferedImage = ImageIO.read(url);           
    } catch (IOException e) { e.printStackTrace(); }        
    mSmoke = bufferedImage;

Чтобы нарисовать изображение, я использую этот метод:

public void draw(Graphics2D g) {    
g.drawImage(mTextures[iCurrentFrame], mAffineTransform, null); }

Указанные изображения - SheetedSpritesобычно вырезают из листа спрайта, используя:

for each frame in animation...

myBufferedImage.getSubimage(i * iFrameWidth, 0, iFrameWidth, iHeight);

, что делается во время игры при создании сущности.Удаление этой строки не решило проблему, поэтому я предполагаю (возможно, плохо), что getSubimage () не достаточно дорогой, чтобы вызвать проблему.

Я мог бы зациклить каждый кадр анимации и нарисовать их вседля быстрого решения, но я хотел бы больше узнать о проблеме и почему это происходит.

Важно отметить, что после того, как SheetedSprite был нарисован один раз, вы можете обновить страницу, и проблема больше не возникает.Игра идет идеально гладко после того, как все было нарисовано ранее.Это относится как к IE, так и к Chrome (я не пробовал его ни в одном другом браузере).В качестве примечания, проблема никогда не возникает в Eclipse Viewlet Applet.

Мое лучшее предположение - то, что изображения каким-то образом кэшируются браузером, хотя на самом деле я в тупике.Я не пробовал загружать / рисовать изображения с другим набором графических библиотек (Slick2D, LWJGL и т. Д.).Спасибо за любые предложения!

1 Ответ

0 голосов
/ 06 декабря 2013

У меня была эта проблема около 2 лет назад, и я нашел решение этой проблемы на замечательном Java-gaming.org.Проблема для меня заключалась в том, что в Java есть проблемы с некоторыми видами png-файлов.Некоторые вызовут отставание при первом использовании, а некоторые - нет.Этот «метод-фиксатор-верхний» принимает BufferedImage и возвращает BufferedImage, но между ними он делает некоторую магию, облегчающую декодирование изображения для Java (не спрашивайте меня, как).Наслаждайтесь!

private BufferedImage toCompatibleImage(BufferedImage image)
{
    if(image==null)System.out.println("Image is null");
    // 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(), image.getTransparency());

    // 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
    return new_image; 
}
...