【问题标题】:Java. Collision detection爪哇。碰撞检测
【发布时间】:2026-01-23 23:05:01
【问题描述】:

我使用矩形编写了一个简单的碰撞检测。我必须检查渲染方法中的重叠。你能告诉我第一种方法更快吗:

render()
    {
        Rectangle playerRectangle = new Rectangle(
                        playerTransformComponent.x,
                        playerTransformComponent.y,
                        playerDimensionsComponent.width,
                        playerDimensionsComponent.height);
                for(Rectangle block : blocksList){
                  //check collision
                 }
    }

或者第二种方式:

Rectangle playerRectangle = new Rectangle();
render()
{
    playerRectangle.x = playerTransformComponent.x;
    playerRectangle.y = playerTransformComponent.y;
    playerRectangle.width = playerDimensionsComponent.width;
    playerRectangle.height = playerDimensionsComponent.height;
    for(Rectangle block : blocksList){
              //check collision
             }
}

【问题讨论】:

  • 内部 for 循环需要时间,如果您关心性能,则需要研究碰撞检测算法,不必担心创建单个对象。
  • 一种有效的方法是使用动态 AABB 树。您可以在网上冲浪以获取更多信息。速度取决于“检查碰撞”循环的实施
  • 你必须知道,渲染平均每秒被调用 55 次(这可能会有所不同,但重点是它会被一次又一次地调用)所以在渲染中创建一个矩形对象每秒会创建一个新对象 55 次,这反过来会调用垃圾收集,你的游戏会有延迟,你的第二种方法比第一种更好
  • 为什么重要?您不妨问问我们,这两者中哪一个看起来更好打印、装裱并挂在您休息室的壁炉上方

标签: java libgdx


【解决方案1】:

render() 函数是一个循环,所以第一种方法显然是错误的——你每帧都创建一个对象——它会丢失一切。
第二种方式肯定更快。
希望对您有所帮助!
静态的

【讨论】: