>>> list("Word to Split")
['W', 'o', 'r', 'd', ' ', 't', 'o', ' ', 'S', 'p', 'l', 'i', 't']
Небольшую игру, которую я создал, можно найти здесь
long renderStart = System.nanoTime ()
// рендерим здесь
long renderTime = (System.nanoTime () - renderStart) / 1000000;
Swing будет медленным для игры. Лучше всего, вероятно, использовать оболочку SDL, например jsdl или sdljava . SDL довольно легкий и поддерживается на многих платформах.
Приятно то, что хорошо реализованные оболочки библиотеки 2d-графики реализуют интерфейс Graphics
, поэтому вы сможете попробовать несколько и посмотреть, какая из них работает лучше всего. для вашего приложения без изменения кода.
Я не эксперт, но Java2D поддерживает разные конвейеры рендеринга. На моей машине переключение на OpenGL путем установки системного свойства
sun.java2d.opengl = true
привело к значительному увеличению скорости рендеринга.
Я согласен с Николасом, обработка графики / интерактивности великолепна
Попробуйте JGame . Это простой движок для 2D-игр, который использует GL, когда он доступен, и может создавать игры, работающие на чем угодно, от мобильного телефона до настольной системы.
Прежде всего, вы должны проверить и посмотреть, сколько время, затрачиваемое на ваш собственный код, в сравнении с тем, сколько времени тратится на рисование кадра. У вас может быть ошибка или сбой, из-за которых он работает медленнее.
Вы должны получить гораздо лучшую производительность, чем 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 не пытается очистить фон вашего компонента за вас.
Производительность Java2D - это своего рода темное искусство. Он может варьироваться между платформами, но его можно добиться хорошей работы.
Иногда выполнение, казалось бы, безобидных вещей может привести к гораздо более низкой производительности. Вы хотите убедиться, что вы максимально используете ускоренные изображения .
Тип изображения также может иметь значение. Я не знаю полной информации, но знаю, что мои программы были намного быстрее, используя изображения типа 1 (INT RGB), чем другие типы, такие как тип 5 (3BYTE BGR), из-за проблем с преобразованием.
Несколько советов по повышению производительности:
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.
Я не могу точно сказать, что вы делаете. Ваш вопрос касается Swing, но вы упоминаете Canvas и Bufferstrategy. Что ж, в Swing вы бы использовали JPanel, который автоматически дважды буферизуется, так что вам не о чем беспокоиться.
Я тестировал простую анимацию с 1000 движущихся шариков. Таймер был настроен на срабатывание каждые 100 мс. Когда таймер сработал, шарик 1000 случайно переместился в новое положение, и было создано новое изображение BufferedImage, а панель, отображающая изображение, была перекрашена. Разница во времени между перерисовкой составила 110 мс, что означает, что для создания нового изображения BufferedImage и выполнения рисования потребовалось всего 10 мс. Рисование было выполнено в полноэкранном режиме, поэтому обрезка не производилась.
В этой публикации показан тестируемый мной пример кода.