Странная проблема BufferStrategy - игра работает быстро только на графических процессорах Intel
Я столкнулся с очень странной проблемой, я пытался искать ответ в течение нескольких дней. Моя игра только что получила новую систему частиц, но была слишком медленной, чтобы ее можно было играть. К сожалению, преобразования BufferedImage очень медленные. Эффект взрыва состоит из около 200 белых спрайтов, загруженных из файла .png, повернутых, масштабированных и раскрашенных случайным образом, перемещающихся со случайной скоростью.
Я попытался улучшить производительность с тройной / двойной буферизацией и столкнулся с некоторыми проблемами.
Моя первая попытка была с JPanel, на которой была нарисована игра. Я установил буферы в классе JFrame (Main), затем сделал рисование в классе Game (extends JPanel), НО, без Graphics g = bufferstrategy.getDrawGraphics () ;. Затем, в конце метода рисования, я показал буфер, если он не был потерян. Буфер всегда был «потерян», так как я не рисовал с его графическим объектом. Но! Игра работает так быстро, как в аду! Без буфера в практическом использовании! Но как?
Эта попытка закончилась без графических ошибок и с ОГРОМНЫМ повышением производительности - но только на картах nVidia / AMD. Графические процессоры Intel не могли справиться с этим, экран мигал белым.
Итак, я настроил и правильно использовал BufferStrategy. Класс Game теперь расширяет Canvas, а не JPanel, так как получает графику из JFrame, и его использование для рисования на JPanel заканчивается смещением, так как он рисует под строкой заголовка. Все еще быстро, исправьте 60 FPS.
Теперь, когда я создал BufferStrategy в JFrame (основной класс), изображения вообще не было. Я исправил это, настроив BufferStrategy в классе Game (Canvas). Теперь картина правильная, но сама игра медленная, как улитка. Один взрыв срывает FPS до ~ 10, но только на nVidia / AMD. Иронический. Даже старые графические процессоры Intel поддерживают 60 FPS, мне удалось получить 10000 частиц в движении со скоростью 60 FPS на 5-6-летнем интегрированном графическом процессоре Intel. Моя карта увеличивает нагрузку до 100% при взрыве.
Вот мой основной код (весь код неясен и длинен):
public class Game extends Canvas {
-snip-
public void tick() {
BufferStrategy bf = getBufferStrategy();
Graphics g = null;
try {
g = bf.getDrawGraphics();
paint(g);
} finally {
g.dispose();
}
if (!bf.contentsLost()) {
bf.show();
} else {
System.err.println("Buffer lost!");
}
Toolkit.getDefaultToolkit().sync();
}
public void setBuffers() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
if (gc.getBufferCapabilities().isMultiBufferAvailable()) {
createBufferStrategy(3);
System.out.println("Triple buffering active");
} else {
createBufferStrategy(2);
System.err.println("Triple buffering not supported by the GPU");
System.out.println("Double buffering active");
}
System.out.println("FullScreen required: " + getBufferStrategy().getCapabilities().isFullScreenRequired());
System.out.println("Page flipping: " + getBufferStrategy().getCapabilities().isPageFlipping());
}
public void paint(Graphics g) {
super.paint(g);
//set up RenderingHints, draw stuff
}
-snip snip-
}
Конечно, я вызываю setBuffers (), как только игра запускается.
Я надеюсь, что вы можете мне помочь, эта проблема очень важна, так как использование VolatileImage, по моему мнению, не даст повышения производительности, так как манипулирование изображениями должно выполняться с помощью BufferedImage. Держу пари, я упускаю что-то тривиальное или что-то делаю неправильно.
Вот мои характеристики компьютера, просто чтобы показать, что это не аппаратная проблема: Intel Core i7-3770k @ 4,3 ГГц, nVidia GTX 460, 12 ГБ оперативной памяти
«Быстрый» компьютер: Intel Core 2 Duo с частотой 2,7 ГГц, интегрированная графика Intel, оперативная память 2 ГБ
Спасибо за вашу помощь и время! :)
РЕДАКТИРОВАТЬ Может ли VolatileImage помочь? Если я знаю правильно, манипуляции с изображениями должны выполняться с использованием BufferedImages, но рисование их является вялым.