Java平台游戏性能

时间:2016-07-19 02:36:44

标签: java performance graphics frame-rate

我最近开始研究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);
    }

}

所以问题是,如果在绘画之前检查它是否在屏幕上会更快吗?

2 个答案:

答案 0 :(得分:1)

检查它是否在屏幕上应该不超过1或2步。

绘制所有内容需要您将每个像素绘制到屏幕上,无论它是否被使用。

答案 1 :(得分:1)

如果gameObject.paint(g);涉及大量的绘图调用,那么分支(检查)很可能会节省更多的工作而不是成本。如果它只是像绘制一个sprite的绘图调用那样,你的库已经执行了这样的检查以避免缓冲区溢出,而你的库将是多余的。

那就是说,如果你开始在这里遇到性能问题,那么我建议使用某种数据结构。一个简单的网格是这样的:

enter image description here

当您的元素移动时,将它们从它们占据的网格单元格中移除,并将它们插入到它们占据的新网格单元格中。如果你有效地实现这一点,那应该只涉及操纵几个整数。

然后,当您想在屏幕上绘制元素时,只绘制重叠的网格单元格中的元素。这将阻止你循环游戏世界中的每一个元素。如果需要,这对于加速碰撞检测也很方便。

四叉树是另一种选择,虽然更新成本稍高,但如果游戏中的元素分布稀疏,它可以提供更好的搜索质量。