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