Итак, я недавно задал вопрос о том, как предварительно загрузить изображения в Java ( предварительная загрузка изображений в Java ), и это сработало великолепно!Пока я не пошел играть в игру.Частота кадров резко упала.Я не знаю, что это было, но в основном у меня есть целая карта спрайтов, загруженная в массив.Каждое изображение соответствует повороту на три градуса.Таким образом, 5 градусов станут 3-градусным изображением, 6 - 6, и т. Д. (Я попробовал Math.round, и он фактически заставил изображения 5 и 4-градусного перейти к 6-градусному изображению, и это более желательноОднако, это медленнее)
Я ищу несколько способов оптимизации кода.Вот мои расчеты углов:
private float getAngle(double x, double y) {
float angle = (float) Math.toDegrees(Math.atan2(y - this.getCenterY(), x - this.getCenterX()));
if(angle < 0){
angle += 360;
}
return angle;
}
Значения x и y, введенные в метод, являются центральными значениями x и y врага, на который нацелена башня, выполняющая этот расчет.Затем этот код выполняется в методе рисования:
if(airID==Value.towerCannon && (airRow>0 && airRow<5) && angle>=0) {
if(angle==Canvas.rotatedAirMap.length) angle = 0;
g.drawImage(Canvas.rotatedAirMap[angle][level-1], x, y, width, height, null);
} else {
g.drawImage(Canvas.airMap[airRow][airID], x, y, width, height, null);
}
}
Это позволит нарисовать соответствующее предварительно загруженное изображение, повернутое на заданный угол («Угол» - или идентификатор изображения - вычисляется, когда башняснимает, разделив результат вычисления угла на три, а затем приведя его к целому числу - я мог бы также округлить это значение)
Какие-либо предложения о том, как оптимизировать это, чтобы я не получал такие массивные выпадения кадров?Я предполагаю, что падение кадров происходит из-за слишком маленького размера кучи виртуальной машины, но я увеличил его, и все же ничего существенного не происходит.Любая помощь будет принята с благодарностью.
Спасибо!
@VGR вот что я сделал с вашим ответом:
public void paintComponent(Graphics g) {
if(isFirst) { //Define stuff when isFirst is true
define(); //Sets up the image arrays
GraphicsConfiguration config = getGraphicsConfiguration();
if(config == null) {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
config = env.getDefaultScreenDevice().getDefaultConfiguration();
}
BufferedImage compatibleImage = config.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency());
g = compatibleImage.createGraphics();
isFirst = false;
}
}
Это работает немного немного быстрее, но мне пришлось сделать некоторые обходные пути.repaint () вызывается в игровом цикле (этот класс реализует runnable). Таким образом, графический компонент, созданный методом repaint (как это работает), является графикой, которую я использую для всей игры.Будет ли это правильный способ сделать это?