Java2D: BufferedImage не ускоряется в Ubuntu

В настоящее время мы разрабатываем игру на Java с использованием Java2D API и испытываем некоторые странные проблемы с производительностью при ее запуске в среде Ubuntu.

Наша частота кадров упала с 62 кадров в секунду в системах Windows и Mac до примерно 10 кадров в секунду в Ubuntu. После нескольких часов отладки и тестирования различных флагов JVM кажется, что BufferedImages с использованием битовой маски не ускоряется в Ubuntu, потому что

System.out.println(img.getCapabilities(config).isAccelerated());

выводит false.

В настоящее время мы загружаем наши изображения через

img = ImageIO.read(url);

а затем создают совместимое с устройством BufferedImage, используя следующий метод:

private static BufferedImage createCompatibleImage(BufferedImage img) {

    // Get default graphics device
    GraphicsDeviceService graphicsDevice = ServiceProvider
            .getService(GraphicsDeviceService.class);
    GraphicsConfiguration config = graphicsDevice
            .getGraphicsConfiguration();

    // Get desired transparency mode
    int transparency = img.getColorModel().hasAlpha() ? Transparency.BITMASK
            : Transparency.OPAQUE;

    // Create device compatible buffered image
    BufferedImage ret = config.createCompatibleImage(img.getWidth(),
            img.getHeight(), transparency);

    // Draw old image onto new compatible image
    Graphics2D graphics = ret.createGraphics();
    graphics.drawImage(img, 0, 0, null);
    graphics.dispose();

    // Return compatible image
    return ret;
}

При создании совместимых изображений BufferedImages с использованием Transparency.OPAQUE отметьте, что первая строка кода выше выводит на печать истину, что указывает на то, что изображение теперь ускорено, а частота кадров вернулась к норме.

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

Итак, кто-нибудь знает решение этой проблемы?


person Scott    schedule 09.06.2011    source источник
comment
Вы используете в Ubuntu видеодрайвер, который поддерживает графику с аппаратным ускорением?   -  person Jesper    schedule 09.06.2011
comment
Да, я использую видеодрайвер, который поддерживает аппаратное ускорение, и, как указано выше, игра работает нормально, если не используется прозрачность.   -  person Scott    schedule 09.06.2011
comment
Я предлагаю зайти в код isAccelerated () и выяснить, почему он возвращает false.   -  person Gili    schedule 11.06.2011
comment
Пытались вместо этого использовать VolatileImage?   -  person Paŭlo Ebermann    schedule 20.06.2011
comment
Другой вопрос: если вы делаете игру, зачем вы вообще используете BufferedImage / Canvas? Было бы намного быстрее просто использовать JOGL для всех ваших задач рендеринга.   -  person Mikola    schedule 20.06.2011
comment
@Mikola: JOGL добавляет к зависимостям собственную библиотеку, что может стать серьезной проблемой (например, при работе в качестве апплета) и усложняет развертывание.   -  person Joachim Sauer    schedule 21.06.2011


Ответы (1)


Я считаю, что проблема в том, что вы используете BITMASK в среде с аппаратным ускорением.

Я не совсем понимаю, в чем заключаются ограничения.

  • только VolatileImage? Или это также относится к экземплярам BITMASK BufferedImage?
  • применимо ли это как к конвейерам OpenGL, так и к Direct3D? (не благоразумно по отношению к этой теме; OpenGL - единственный доступный в Linux)

В любом случае «решение» состоит в том, чтобы использовать изображения BITMASK только в средах программной визуализации; в средах с аппаратным ускорением вам необходимо использовать ПРОЗРАЧНЫЕ изображения. Мне трудно найти достоверный источник для моей заявки, кроме более старой ветки javagaming.org, поэтому единственное, что я могу сказать, - это попробовать.

http://www.java-gaming.org/index.php?topic=19561.5

person Gimby    schedule 21.06.2011