Java 平台游戏性能
Java platformer game performance
我最近开始在 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);
}
}
所以问题是,在绘制之前使用 if 语句检查它是否在屏幕上会更快吗?
是的。
检查它是否在屏幕上应该只需要 1 或 2 个步骤。
绘制所有内容需要您将每个像素都绘制到屏幕上,无论是否使用它。
如果 gameObject.paint(g);
涉及大量绘图调用,那么分支(检查)很可能会比成本节省更多的工作。如果它只是一个绘制精灵的绘图调用,那么您的库已经执行了这样的检查以避免缓冲区溢出,而您的库将是多余的。
就是说,如果您在这里开始遇到性能问题,那么我建议您使用某种数据结构。一个简单的是像这样的网格:
当您的元素移动时,将它们从它们占据的网格单元格中移除,并将它们插入到它们占据的新网格单元格中。如果你有效地实现它,那应该只涉及操纵几个整数。
然后当你想在屏幕上绘制元素时,只绘制重叠的网格单元格中的元素。这将阻止您遍历游戏世界中的每个元素。如果需要,这对于加速碰撞检测也很方便。
虽然更新成本稍高,但四叉树是一种替代方法,但如果游戏中的元素分布稀疏,它可以提供更好的搜索质量。
我最近开始在 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);
}
}
所以问题是,在绘制之前使用 if 语句检查它是否在屏幕上会更快吗?
是的。
检查它是否在屏幕上应该只需要 1 或 2 个步骤。
绘制所有内容需要您将每个像素都绘制到屏幕上,无论是否使用它。
如果 gameObject.paint(g);
涉及大量绘图调用,那么分支(检查)很可能会比成本节省更多的工作。如果它只是一个绘制精灵的绘图调用,那么您的库已经执行了这样的检查以避免缓冲区溢出,而您的库将是多余的。
就是说,如果您在这里开始遇到性能问题,那么我建议您使用某种数据结构。一个简单的是像这样的网格:
当您的元素移动时,将它们从它们占据的网格单元格中移除,并将它们插入到它们占据的新网格单元格中。如果你有效地实现它,那应该只涉及操纵几个整数。
然后当你想在屏幕上绘制元素时,只绘制重叠的网格单元格中的元素。这将阻止您遍历游戏世界中的每个元素。如果需要,这对于加速碰撞检测也很方便。
虽然更新成本稍高,但四叉树是一种替代方法,但如果游戏中的元素分布稀疏,它可以提供更好的搜索质量。