Странная проблема 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, но рисование их является вялым.

Ответы на вопрос(3)

Ваш ответ на вопрос