У меня возникла очень странная проблема, я пытался найти ответ в течение нескольких дней и дней. В моей игре появилась новая система частиц, но она была слишком медленной, чтобы играть. К сожалению, преобразования BufferedImage очень медленные. Эффект взрыва состоит из около 200 белых спрайтов, загруженных из файла PNG, повернутых, масштабированных и окрашенных случайным образом, движущихся со случайной скоростью.
Я попытался повысить производительность с помощью тройной/двойной буферизации и столкнулся с некоторыми проблемами.
Моя первая попытка была с JPanel, на которую была нарисована игра. Я настроил буферы в классе JFrame (Main), затем сделал чертеж в классе Game (extans 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 на интегрированном Intel GPU на 5-6 лет. Моя карта ударяет до 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.3GHz, nVidia GTX 460, 12 ГБ RAM
"Быстрый" компьютер: Intel Core 2 Duo 2,7 ГГц, Интегрированная графика Intel, 2 ГБ RAM
Спасибо за помощь и время!:)
ИЗМЕНИТЬ Может ли помочь VolatileImage? Если я правильно знаю, манипуляции с изображениями должны выполняться с использованием BufferedImages, но их рисование вяло.