Java программа не использует GPU для отрисовки
Есть мир-двух мерный массив в нем есть клетки которые ходят, едят друг друга, множатся и тд, раз в два хода происходит отрисовка мира, для отрисовки используется swing.Вот как это выглядит:
На ПК и другом слабом ноутбуке(i3 два ядра 1.4GHz) всё работает нормально, программа использует видеокарту:
но на новом ноутбуке(i5-4300m 2.6-3.3 GHz,HD Graphics 4600),программа видеокарту не использует и отрисовка происходит очень медленно, программа работает очень медленно
Как это исправить? Вот код для отрисовки:
for (int i = 0; i <width ; i++) {
for (int j = 0; j < height; j++) {
if(cells[i][j]!=null){
if(cells[i][j].secCell==null && cells[i][j].partCell==null ){
g.setColor(cells[i][j].getColor());
g.fillRect(i * cellSize, j * cellSize, cellSize, cellSize);
}
else
if(cells[i][j].secCell!=null && cells[i][j].partCell==null ){
g.setColor(cells[i][j].secCell.getColor());
g.fillRect(i * cellSize, j * cellSize, cellSize, cellSize);
}
if (cells[i][j]!=null && cells[i][j].partCell!=null){
g.setColor(cells[i][j].partCell.getColor());
g.fillRect(i * cellSize, j * cellSize, cellSize, cellSize);
}
}
}
}
Пробовал ставить другую версию jdk и переустанавливать драйвера на видеокарту, не помогло. Запускал на ноутбуке пару игр(Crash Wheels,Delver,Darkest Dungeon) они работают нормально больше 30 фпс в каждой на средних, высоких настройках графики, Delver написан на java и работает нормально(60 фпс).
Ответы (2 шт):
Попрошу вас обратить внимание, что последняя версия драйвера для встроенной видеокарты HD Graphics 4600 выходила под версию Windows 8.1. А у вас я так полагаю Windows 10. Из-за проблем связи операционной системы и драйвера,ваш ноутбук и вовсе "может не понимать" как работать с видеокартой.

Вообще рекомендую самостоятельно ознакомится со страницей вашей видеокарты: https://www.intel.com/content/www/us/en/support/products/81496/graphics/graphics-for-4th-generation-intel-processors/intel-hd-graphics-4600.html#support-article-selector
Проблему с ноутбуком решить не смог(менял дрова на видеокарту, переустанавливал систему, заменил процессор на более мощный с той же интегрированой графикой) но смог оптимизировать код для отрисовки с приемлемой частой, вот он:
public void fullPaint() {
Graphics g=world.getGraphics();
if (buffer == null || buffer.getWidth() != world.getWidth() || buffer.getHeight() != world.getHeight()) {
// Пересоздайте буфер, если он не существует или его размер изменился
buffer = new BufferedImage(world.getWidth(), world.getHeight(), BufferedImage.TYPE_INT_RGB);
}
Graphics bufferGraphics = buffer.getGraphics();
// Отрисовка в буфер
try {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (cells[i][j] != null) {
bufferGraphics.setColor(cells[i][j].getColor());
bufferGraphics.fillRect(i * cellSize, j * cellSize, cellSize, cellSize);
}
}
}
}catch(Exception e ) {
System.err.println("fullpaint error");
}
g.drawImage(buffer, 0, 0, this);
bufferGraphics.dispose();
}
BufferedImage buffer сохранен вне метода