Производительность при обработке графики Java

>>> list("Word to Split")
['W', 'o', 'r', 'd', ' ', 't', 'o', ' ', 'S', 'p', 'l', 'i', 't']
6
задан Marc Müller 12 December 2009 в 13:37
поделиться

10 ответов

  1. Прочтите это о таймерах
  2. Используйте постоянно спящий поток в фоновом режиме, чтобы снизить частоту прерываний системы и получить гораздо более точные таймеры!
  3. Вы можете взять посмотрите мой код в здесь
  4. Небольшую игру, которую я создал, можно найти здесь

     long renderStart = System.nanoTime ()
    // рендерим здесь
    long renderTime = (System.nanoTime () - renderStart) / 1000000;
    
6
ответ дан 8 December 2019 в 03:39
поделиться

Swing будет медленным для игры. Лучше всего, вероятно, использовать оболочку SDL, например jsdl или sdljava . SDL довольно легкий и поддерживается на многих платформах.

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

6
ответ дан 8 December 2019 в 03:39
поделиться

Я не эксперт, но Java2D поддерживает разные конвейеры рендеринга. На моей машине переключение на OpenGL путем установки системного свойства

sun.java2d.opengl = true

привело к значительному увеличению скорости рендеринга.

3
ответ дан 8 December 2019 в 03:39
поделиться

Я согласен с Николасом, обработка графики / интерактивности великолепна

1
ответ дан 8 December 2019 в 03:39
поделиться

Вы можете посмотреть обработка .

2
ответ дан 8 December 2019 в 03:39
поделиться

Попробуйте JGame . Это простой движок для 2D-игр, который использует GL, когда он доступен, и может создавать игры, работающие на чем угодно, от мобильного телефона до настольной системы.

1
ответ дан 8 December 2019 в 03:39
поделиться

Прежде всего, вы должны проверить и посмотреть, сколько время, затрачиваемое на ваш собственный код, в сравнении с тем, сколько времени тратится на рисование кадра. У вас может быть ошибка или сбой, из-за которых он работает медленнее.

Вы должны получить гораздо лучшую производительность, чем 98 мс при отрисовке экрана. Эти игровые библиотеки, вероятно, будут использовать те же графические вызовы, что и вы. Но то, какие контейнеры вы используете, может иметь большое влияние на скорость рисования. Я помню, как пару месяцев назад работал над графическим кодом с двойной буферизацией, и то, как был создан задний буфер , оказал огромное влияние на производительность.

В частности, убедитесь, что вы создаете фоновое изображение только один раз или, по крайней мере, только при изменении размера холста. В моем коде отрисовки я делаю следующее:

        //create a graphics backplane
    if(backplane == null || !backplaneSize.equals(this.getSize())){
        backplane = this.createImage((int)this.getSize().getWidth(), (int)this.getSize().getHeight());
        backplaneSize = this.getSize();
    }

Итак, задняя панель создается только в том случае, если она новая или если размер компонента изменен. Это имеет огромное влияние на скорость.

Я занимаюсь программированием графики на java с JDK 1.0. На самом деле я никогда не слышал об этой штуке с BufferStrategy. Хех.

У меня никогда не было проблем с получением хорошей частоты кадров с помощью простых вызовов java-графики. Еще одна вещь, на которую следует обратить внимание, - это убедиться, что Swing не пытается очистить фон вашего компонента за вас.

1
ответ дан 8 December 2019 в 03:39
поделиться

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

Иногда выполнение, казалось бы, безобидных вещей может привести к гораздо более низкой производительности. Вы хотите убедиться, что вы максимально используете ускоренные изображения .

Тип изображения также может иметь значение. Я не знаю полной информации, но знаю, что мои программы были намного быстрее, используя изображения типа 1 (INT RGB), чем другие типы, такие как тип 5 (3BYTE BGR), из-за проблем с преобразованием.

1
ответ дан 8 December 2019 в 03:39
поделиться

Несколько советов по повышению производительности:

  1. Вырежьте и просто нарисуйте область, которая изменилась
  2. Не масштабируйте ничего при рисовании
  3. Используйте правильную стратегию буфера
  4. При необходимости используйте полноэкранный монопольный режим .

Swing по своей сути не медленный. Большая часть путаницы по поводу Swing исходит от людей, которые не знают или не понимают о потоке отправки событий (и да, требуется много усилий, чтобы понять это правильно).

Что касается вашего времени, вы просто вызываете g.drawImage между настройками времени? Если да, то какой размер вы перекрашиваете и выполняете ли вы какое-либо масштабирование на этом вызове?

РЕДАКТИРОВАТЬ: Забыл упомянуть Pulp Core - очень хороший игровой фреймворк для Java.

t масштабировать что-либо при рисовании
  • Используйте правильную стратегию буфера
  • Используйте полноэкранный монопольный режим , если это необходимо.
  • Swing по своей сути не медленный. Большая часть путаницы по поводу Swing исходит от людей, которые не знают или не понимают о потоке отправки событий (и да, требуется много усилий, чтобы понять это правильно).

    Что касается вашего времени, вы просто вызываете g.drawImage между настройками времени? Если да, то какой размер вы перекрашиваете и выполняете ли вы какое-либо масштабирование на этом вызове?

    РЕДАКТИРОВАТЬ: Забыл упомянуть Pulp Core - очень хороший игровой фреймворк для Java.

    t масштабировать что-либо при рисовании
  • Используйте правильную стратегию буфера
  • Используйте полноэкранный монопольный режим , если необходимо.
  • Swing по своей сути не медленный. Большая часть путаницы по поводу Swing исходит от людей, которые не знают или не понимают о потоке отправки событий (и да, требуется много усилий, чтобы понять это правильно).

    Что касается вашего времени, вы просто вызываете g.drawImage между настройками времени? Если да, то какой размер вы перекрашиваете и выполняете ли вы какое-либо масштабирование на этом вызове?

    РЕДАКТИРОВАТЬ: Забыл упомянуть Pulp Core - очень хороший игровой фреймворк для Java.

    Я не знаю или не понимаю потока диспетчеризации событий (и да, требуется много усилий, чтобы сделать это правильно).

    Что касается вашего времени, вы просто вызываете g.drawImage между настройками времени? Если да, то какой размер вы перекрашиваете и выполняете ли вы какое-либо масштабирование на этом вызове?

    РЕДАКТИРОВАТЬ: Забыл упомянуть Pulp Core - очень хороший игровой фреймворк для Java.

    Я не знаю или не понимаю потока диспетчеризации событий (и да, требуется много усилий, чтобы сделать это правильно).

    Что касается вашего времени, вы просто вызываете g.drawImage между настройками времени? Если да, то какой размер вы перекрашиваете и выполняете ли вы какое-либо масштабирование при этом вызове?

    РЕДАКТИРОВАТЬ: Забыл упомянуть Pulp Core - очень хороший игровой фреймворк для Java.

    6
    ответ дан 8 December 2019 в 03:39
    поделиться

    Я не могу точно сказать, что вы делаете. Ваш вопрос касается Swing, но вы упоминаете Canvas и Bufferstrategy. Что ж, в Swing вы бы использовали JPanel, который автоматически дважды буферизуется, так что вам не о чем беспокоиться.

    Я тестировал простую анимацию с 1000 движущихся шариков. Таймер был настроен на срабатывание каждые 100 мс. Когда таймер сработал, шарик 1000 случайно переместился в новое положение, и было создано новое изображение BufferedImage, а панель, отображающая изображение, была перекрашена. Разница во времени между перерисовкой составила 110 мс, что означает, что для создания нового изображения BufferedImage и выполнения рисования потребовалось всего 10 мс. Рисование было выполнено в полноэкранном режиме, поэтому обрезка не производилась.

    В этой публикации показан тестируемый мной пример кода.

    1
    ответ дан 8 December 2019 в 03:39
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: