ios - 如何组合这两个 Cocos2D if 语句?

标签 ios performance if-statement cocos2d-iphone

我正在寻找一种简单的方法来在我的 Cocos2D 应用程序中组合这 2 个 if 语句。然而到目前为止我的尝试根本没有奏效。

谢谢!

最佳答案

我相信您尝试将 if 语句合并为一个语句是由于您实际理解该语句的问题。作为一名程序员,您的首要职责是编写可读的代码,即使您是唯一阅读该代码的人。我能想到为什么你只想要一个 if 语句的另一个原因是你认为这会更快。

所以首先我将把所有计算移出 if 子句。这不仅重复,而且容易出错并且很难阅读。我还冒昧地将除以 2 替换为乘以 0.5f,因为 ARM 处理器没有除法指令,因此除法由软件执行并重写为乘法。编译器可能已经对此进行了优化,但如果可以的话,避免除法运算仍然是一个好的做法。

这就是我如何编写该声明。额外的局部变量不会导致性能损失。通常编译器无论如何都会做类似的事情。同样,如果 spriteA.tag 不为 1,则该条件不会评估第一个 if 条件的其余部分,而是直接跳转到测试 else if 部分。这称为“提前退出”:在第一个测试中,这将导致整个条件失败,程序将停止评估剩余的测试,因为这样做是没有意义的。因此,最好以最常失败的条件开始 if 语句(或嵌套 if)。

float spriteAHalfWidth = spriteA.boundingBox.size.height * 0.5f;
float spriteBHalfWidth = spriteB.boundingBox.size.height * 0.5f;

float spriteALeftSide = spriteA.position.x - spriteAHalfWidth;
float spriteARightSide = spriteA.position.x + spriteAHalfWidth;
float spriteBLeftSide = spriteB.position.x - spriteBHalfWidth;
float spriteBRightSide = spriteB.position.x + spriteBHalfWidth;

if (died == NO)
{
    if (spriteA.tag == 1 && spriteB.tag == 4 && 
        spriteALeftSide <= spriteBRightSide)
    {
        float y = spriteB.position.y + spriteBHalfWidth +
                  sprite.boundingBox.size.height * 0.5f;
        sprite.position = ccp(pos.x, y);
    } 
    else if (spriteA.tag == 4 && spriteB.tag == 1 && 
             spriteBLeftSide <= spriteARightSide) 
    {
        float y = spriteA.position.y + spriteAHalfWidth +
                  sprite.boundingBox.size.height * 0.5f;
        sprite.position = ccp(pos.x, y);
    }
}

不用说,您不能将其合并到单个 if 语句中。最后,您执行两个不同的函数(根据 spriteA 或 spriteB 的 y 位置更新位置)。因此您需要有两个分支。

如果您愿意,如果您确实想避免最外面的 if 子句,可以添加 died == NO 作为两个嵌套 if 语句中的第一个测试。然而,这样做会让你的程序总是测试 died == NO 两次,即使 dead 变量不会改变。另一方面,编译器也可能识别并优化这种情况。

关于ios - 如何组合这两个 Cocos2D if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9043353/

相关文章:

iphone - GSEventCreateKeyEvent

ios - 如何暂停 CADisplayLink?

ios - 在 OperationQueue(或替代 API,例如 PromiseKit、Combine Framework)中设置背压

python - 将 Pandas 数据框列拆分为多列的最有效方法

javascript - 我想根据特定条件更改状态

ios - 与 UIWebView 和本地 HTML 相比,Cordova 有什么好处?

php - 我应该使用更受约束的 SQL 查询还是在代码中处理结果集?

html - 缩小 css 和压缩 css 有什么区别

c# - 一个 'else' 用于嵌套的 'if' 语句

php - woocommerce 类别深度作为 if 语句的条件