我最近开始研究java中的2d平台游戏,并且正在询问与性能相关的问题。
在我的游戏中,我有一个世界(现在相对较小)。
但是超过一半的世界并没有被玩家的相机看到,但是我仍然在画整个世界(甚至是看不见的部分)。
这就是我现在正在做的事情。
@Override
public void paintComponent(Graphics g){
g.translate(player.camX(), player.camY());
for (GameObject gameObject : solidObjects){
if (gameObject.isTouching(player.getCameraRect()))
gameObject.paint(g);
}
player.paint(g);
for (GameObject gameObject : unSolidObjects){
if (gameObject.isTouching(player.getCameraRect()))
gameObject.paint(g);
}
}
所以问题是,如果在绘画之前检查它是否在屏幕上会更快吗?
答案 0 :(得分:1)
是
检查它是否在屏幕上应该不超过1或2步。
绘制所有内容需要您将每个像素绘制到屏幕上,无论它是否被使用。
答案 1 :(得分:1)
如果gameObject.paint(g);
涉及大量的绘图调用,那么分支(检查)很可能会节省更多的工作而不是成本。如果它只是像绘制一个sprite的绘图调用那样,你的库已经执行了这样的检查以避免缓冲区溢出,而你的库将是多余的。
那就是说,如果你开始在这里遇到性能问题,那么我建议使用某种数据结构。一个简单的网格是这样的:
当您的元素移动时,将它们从它们占据的网格单元格中移除,并将它们插入到它们占据的新网格单元格中。如果你有效地实现这一点,那应该只涉及操纵几个整数。
然后,当您想在屏幕上绘制元素时,只绘制重叠的网格单元格中的元素。这将阻止你循环游戏世界中的每一个元素。如果需要,这对于加速碰撞检测也很方便。
四叉树是另一种选择,虽然更新成本稍高,但如果游戏中的元素分布稀疏,它可以提供更好的搜索质量。