Итак, я создаю небольшой 2D-игровой движок. Пока это работает нормально, однако рендеринг немного нервничает и имеет задержку каждые 1-2 секунды (кадр замерзает на полсекунды). Несмотря на то, что это вряд ли является нарушителем сделки, это раздражает, что нужно разобраться, и мне явно любопытно, почему это так.Каков самый быстрый способ рендеринга JPanel?
Так что мой текущий метод для визуализации кадра является манипулируя g2d объект определенного JPanel:.
(IMG является картой, что нарисовано Этот метод является частью класса, который имеет всю информацию, как ширина и высота экрана и положение камеры. (так PosX, Пози, ширина, высота берутся из Instace объекта это называется на)
public void DrawByManipulatedMapSubimage(BufferedImage img, Graphics2D g2d)
{
if (isActive)
{
BufferedImage img2 = img.getSubimage(PosX, PosY, width, height);
g2d.drawImage(img2,0,0,null);
List<MapObject> MapObjects = Map.getObjectInformation();
List<UiComponent> UC = this.UI.getUiComponents();
int l = this.Map.getObjectInformation().size();
for (int i = 0; i < l; i++)
{
MapObject MO = MapObjects.get(i);
int MOX = MO.getPosX();
int MOY = MO.getPosY();
BufferedImage MOB = MO.getCurrentAnimation().getCurrentlyActiveFrameAsBufferedImage();
g2d.drawImage(MOB, MOX - PosX, MOY - PosY, null);
}
for (int i = 0; i < UC.size(); i++)
{
UiComponent CC = UC.get(i);
if (CC.isVisible())
{
Point P = CC.getPosition();
int x = P.x;
int y = P.y;
g2d.drawImage(CC.getImg(),x,y,null);
}
}
try
{
Thread.sleep(0);
}
catch (InterruptedException ex)
{
Logger.getLogger(Viewport.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
что это в основном делает это, что он
Пишет SubImage текущей активной карте, основываясь на том, где пользователь просматривает из (камера-View в пути)
Рисует BufferedImage Расчетного Animation всех приложенных MabObjects (в основном всё, что связано изменить; как игрок, Npcs, движущиеся деревья, космические корабли, что угодно).
Рисует все прикрепленные UserInterface-компоненты поверх двух последних вещей. (только такие вещи, как характер портретов, например; ни одна из кнопок или что-нибудь interactable)
То, что делает меня любопытно, что это не может быть случай, когда программа использует столько процессора, что его просто не может идти в ногу с рендерингом, так как программа имеет те же самые задержки, что и с прилагаемыми дополнениями x, как без них. Также эта программа использует около 5% моего процессора (при 30 кадрах в секунду)
Таким образом, проблема должна быть где-то еще. Возможно, у вас есть идея оптимизировать его?
Я удалил Thread.sleep (0); но нет никакой разницы. –
вы должны добавить Swing Timer (50-125) с container.repaint(), вызванный после того, как координаты изменены в ActionListener – mKorbel