【问题标题】:How to provide a seperate context on each eval of the java ScriptEngine?如何在 java ScriptEngine 的每个 eval 上提供单独的上下文?
【发布时间】:2013-08-15 05:23:20
【问题描述】:

开发基于 java 的游戏,使用 javax.script for AI;

public class AI implements Runnable {
private boolean alive = true;

String scriptStr;
ScriptEngine scriptEngine;
ScriptContext scriptContext;
Bindings engineScope;

public AI() {
    ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
    scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
    scriptContext = new SimpleScriptContext();
    engineScope = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
    engineScope.put("scene", Scene.instance);

    try {
        scriptStr = new Scanner(new File(getClass().getResource("ai.js").getPath())).useDelimiter("\\Z").next();
    } catch (FileNotFoundException e) {
        e.printStackTrace(); 
    }
}

@Override
public void run() {
    while (alive) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Iterable<IUnit> units = Scene.instance.getUnits();
        for (IUnit unit : units) {
            if (unit.isAlive()) {
                engineScope.put("unit", unit);
                try {
                    scriptEngine.eval(scriptStr, scriptContext);
                } catch (ScriptException e) {
                    e.printStackTrace();  
                }
            }
        }
    }
}
}

在上面的代码中,我有一个提供迭代单元的场景。我想为所有单元调用相同的 js 代码(“ai.js”),其中单元将决定做什么。

问题是我希望每个单元都有自己的上下文数据。所以每次我为一个单元评估 ai.js 时,它们都不会是无状态和无记忆的。

正确的方法是什么?

我是否应该为每个单元明确使用 SpringContext 之类的东西?

或者是否可以像 Unit 类上下文中的函数一样运行 ai.js?

【问题讨论】:

    标签: java javascript scriptengine


    【解决方案1】:

    我使用单个 ScriptEngine 和一个 SimpleScriptContext 来完成这项工作 - 尽管它可能是每个线程。

    创建上下文后,您必须在该上下文中执行它,然后它才能被您的 scriptlet 使用。

    为了优化库的重复包含,我在创建 ScriptEngine 时将其编译为 CompiledScript 一次。

    我编译每个 scriptlet 对象,然后使用 eval(context) 方法来执行它们。

    这足以在我的测试中创建线程安全。

    【讨论】:

      猜你喜欢
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多