所以我正在制作某种小型 2D - 游戏引擎。到目前为止它工作得很好,但是渲染有点紧张,每 1-2 秒有一个延迟(帧冻结半秒)。尽管这几乎不是一个交易破坏者,但它仍然是一个应该解决的烦恼,我显然有点好奇这是为什么。
所以我目前渲染框架的方法是通过操作某个JPanel的g2d对象:
(img 是绘制的地图。此方法是具有所有信息的类的一部分,例如屏幕的宽度和高度以及相机的位置。(因此 PosX,PosY,宽度,高度取自对象的实例这被称为)
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);
}
}
}
这基本上做的是,它
根据用户正在查看的位置(以某种方式查看相机)绘制当前活动地图的子图像
在此之上绘制所有附加 MabObjects 的当前动画的 BufferedImage(基本上是所有会发生变化的东西;比如 Player、Npcs、移动的树木、宇宙飞船等等)。
在最后两件事之上绘制所有附加的 UserInterface-Components。(例如人物肖像之类的东西;没有按钮或任何可交互的东西)
让我好奇的是,这不可能是一个程序使用太多 cpu 以至于它无法跟上渲染的情况,因为程序在运行带有 x 附加附加功能的情况下具有相同的滞后。任何。这个程序也使用了我大约 5% 的 CPU(在 30fps 时)
所以问题必须在其他地方。您可能有优化它的想法吗?