1

我正在实施一些碰撞检测。随着时间的推移,随着项目复杂性的增加,我不断添加额外的检查,我无意中发现了一个如下所示的模式:

for (GameObject o1 : collisionObjects) {
    for (GameObject o2 : collisionObjects) {
        if(o1 == o2){
            continue;
        }

        if(!(o1.isSolid() && o2.isSolid())){
            continue;
        }

        //several more checks

        //all of the early-out conditions are passed so do
        //do some intersection checks here

    }
}

稍后查看整个积累的代码,我想如果我要重构它,我会使用嵌套的 ifs:

for (GameObject o1 : collisionObjects) {
    for (GameObject o2 : collisionObjects) {
        if(o1 != o2){
            if(o1.isSolid() && o2.isSolid()){
                 //all conditions are met so do collision detection
            }
        }
    }
}

从可读性的角度来看,我非常喜欢第一个示例,因为它清楚地打破了所有条件,并且没有给我留下大量嵌套的 ifs。从效率的角度来看,第一个每次都需要更多的比较。

这些方法哪个更好?通过使用第一个而不是第二个,我是否会无意中调用任何副作用?

4

2 回答 2

1

如果您担心第一个需要更多检查,为什么不否定您的逻辑并将第二个 if 语句折叠到第一个?例如

if(o1 != o2 && o1.isSolid() && o2.isSolid()) {
    // extra stuff
}

通过对布尔逻辑的惰性分析,一旦达到 a,语句就会失败false

如果您担心性能,尽管我认为研究碰撞检测策略更为重要。例如,八叉树、BSP 等。

于 2015-11-26T17:33:01.793 回答
0

通过使用第一个而不是第二个,我是否会无意中调用任何副作用?

两者都很好,我看不出其中一个比另一个有任何显着优势。

但是如果你是认真的并且想要做一些高效的事情(例如在一个有数以万计的物体来持续检查碰撞的 3D 世界中),你将会看到树。特别是四叉树。这就是游戏实际进行碰撞检测的方式。

如果您在学校学习游戏,这是一个相当大的话题。

于 2015-11-26T17:40:06.330 回答