【问题标题】:Do nested functions reduce performance?嵌套函数会降低性能吗?
【发布时间】:2023-03-22 20:47:01
【问题描述】:

我有一个班级UglyLobster 在一个横向卷轴类型的游戏中使用了 AS3 中的人工智能。 UglyLobster 是一个很大程度上是自我操作的类,它根据环境确定它接下来要做什么。在构建这种人工智能时,我发现最简单的解决方案是使用嵌套函数。

但是,我不确定嵌套函数是否会影响性能并导致拖累。这个UglyLobster不限于一个实例;许多将同时运行。我添加了代码来显示我正在尝试做的事情。

public class UglyLobster extends Mob {

    //these vars determine what the UglyLobster will do next
    public var behavior = "aggro"
    private var behaviorStep:int = 1

    public function UglyLobster() {
        addEventListener(Event.ENTER_FRAME,performBehavior)
    }

    public function performBehavior(e) {
        if (behavior == "aggro") {
            aggro()
        }
        if (behavior == "tranq") {
            tranq()
        }
    }

    private function aggro() {
        //it is necessary to have multiple steps.
        //in step 1, the Lobster could bare its lobster fangs,
        //then in step 2, crawl toward a point
        //and in step 3, pinch somebody
        if (behaviorStep == 1) {
            step1()
        }
        if (behaviorStep == 2) {
            step2()
        }
        if (behaviorStep == 3) {
            step3()
        }
        function step1() {
            if (someCondition) {
                behaviorStep = 2
            } else {
                //do whatever happens in step1
            }
        }
        function step2() {
            if (someOtherCondition) {
                behaviorStep = 3
            } else {
                //do whatever happens in step2
            }
        }
        function step3() {
            if (anotherCondition) {
                behaviorStep = 1
            } else {
                behavior = "tranq"
            }
        }
    }

    private function tranq() {
        //do nothing
    }

}

嵌套函数是完成任务的一种节省内存的方式吗?如果没有,您将如何为UglyLobster 设置人工智能?例子真的很有帮助

【问题讨论】:

  • 嵌套函数通常被认为是一种糟糕的实践,通常是一些更大的封装设计模式问题的系统性问题。对内存最不利的是确保正确处理附加到嵌套函数的事件侦听器。
  • 嵌套函数在性能或其他方面没有取得任何成就。它们是不好的做法,因为它们是一段不能在代码中重用的代码,因为它们的作用域是函数的本地。

标签: actionscript-3 flash nested-function


【解决方案1】:

即使我不喜欢这种设计,并且可能正如 Jason 所建议的那样,存在架构设计问题,我认为没有必要嵌套函数。

private function aggro() {
    //it is necessary to have multiple steps.
    //in step 1, the Lobster could bare its lobster fangs,
    //then in step 2, crawl toward a point
    //and in step 3, pinch somebody
    if (behaviorStep == 1) {
        step1()
    }
    if (behaviorStep == 2) {
        step2()
    }
    if (behaviorStep == 3) {
        step3()
    }
}

private function step1() {
    if (someCondition) {
         behaviorStep = 2
    } else {
         //do whatever happens in step1
    }
}

private function step2() {
        if (someOtherCondition) {
            behaviorStep = 3
        } else {
            //do whatever happens in step2
        }
 }

private function step3() {
        if (anotherCondition) {
            behaviorStep = 1
        } else {
            behavior = "tranq"
        }
}

【讨论】:

  • 这个想法是每个不同的行为都有自己的一套步骤。 aggro 会有 step1 到 step3,tranq 会有自己的 step1 到 step3。使用嵌套函数(根据我的理解)将允许重复使用这些名称,而不必用不重要的函数弄乱类。对不起,应该更清楚。但是,我同意这是一个糟糕的结构,我正在寻找一个合理的替代方案
  • 如果你想写出好的 AI 看看 FSM(有限状态机),如果你想要更高级的搜索行为树(这是 AI 的最新技术)
  • 感谢领导,尤其是关于 fsm。这很有帮助,我发现一些文章为我指明了正确的方向。我想将此标记为我接受的答案,但原始问题仍未得到解答,我觉得我应该标记与其他人最相关的答案
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多