Java2D: BufferedImage не ускоряется в Ubuntu - PullRequest
5 голосов
/ 09 июня 2011

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

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

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

выводит ложь.

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

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 пометьте первую строку кода выше, чтобы вывести значение true, что указывает на то, что изображение теперь ускорено и частота кадров, похоже, вернулась к нормальной.

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

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

1 Ответ

1 голос
/ 21 июня 2011

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

Мне не совсем ясно, где находятся ограничения.

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

В любом случае «решением» является использование изображений BITMASK только в программных средах; в средах с аппаратным ускорением вместо них необходимо использовать образы TRANSLUCENT. Мне трудно найти действительный источник для моего заявления, кроме более ранней ветки javagaming.org, поэтому единственное, что я могу сказать, это попробовать.

http://www.java -gaming.org / index.php? Тема = 19561,5

...