В настоящее время мы разрабатываем игру на 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, что указывает на то, что изображение теперь ускорено и частота кадров, похоже, вернулась к нормальной.
Однако это, конечно, не наше желаемое решение, так как изображения прорисовываются без какой-либо прозрачности и вместо этого имеют уродливый черный фон.
Итак, кто-нибудь знает решение этой проблемы?