【问题标题】:Get the game state using Multithreading (jME3)使用多线程 (jME3) 获取游戏状态
【发布时间】:2014-04-23 17:35:31
【问题描述】:

我最近通过wiki’s tutorial 尝试了 Java Monkey (3) 的多线程。因为我只是想测试一个原型 clinet,所以我制作了一个程序,它使用“Cubes”库 (hub.jmonkeyengine.org/wiki/doku.php/jme3:contributions:cubes) 创建了一些立方体,然后将其序列化为一些字节数据(这是服务器将对玩家附近的地图块执行的操作)。目的是模仿从服务器发送的块,这将发生在单独的线程中,如 wiki 上的网络教程中所述(hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:网络)。

每个块都有自己的节点来存储它,如果服务器发送了块的更新,或者如果玩家移动到新区域(这将导致块被替换),则块将被替换.代码是here。但问题是,我需要重新创建一个空块,然后才能读取字节,这需要收集应用程序设置。除此之外,我无法在单独的线程中修改游戏场景(该函数可以这样做)。下面的代码来自第 93+ 行。

//...
//(In Update Loop)
if (future.isDone()) {
    //Binds the temporary data to the clone object
    blockTerrainClone = (BlockTerrainControl) future.get();
    future = null;
//...

Callable<BlockTerrainControl> serverInput = new Callable<BlockTerrainControl>() {
    public BlockTerrainControl call() {
        /*Creates a temporary data storage object, then assigns the data. 
        I can't mutate the current BlockTerrainControl which is being rendered, 
        as this is a seperate thread.*/
        BlockTerrainControl data = new BlockTerrainControl(CubesTestAssets.getSettings(app), new Vector3f());
        CubesSerializer.readFromBytes(data, serializedBlockTerrain);

        //Returns the data
        return data;
    }
};

多线程 wiki 文章(靠近底部)确实部分介绍了如何修改场景和访问游戏状态,但没有详细说明。任何人都可以扩展该部分,并解释我如何能够在单独的线程中将块从服务器传输到客户端(或者在这种情况下,将数据从一个线程传输到另一个线程)?

如果我错过了问题中的任何内容,我很乐意补充!感谢阅读。

【问题讨论】:

    标签: java multithreading jmonkeyengine


    【解决方案1】:

    正如您所提到的,不允许从主线程外部操作场景图。 我遇到了同样的问题,我的解决方案是

    • 在线程中创建一个节点并对其进行操作,附加东西等等
    • 准备就绪后,将线程的状态设置为就绪

    • 同时:当线程准备好时检查主循环...如果是,则从线程中获取节点并将其附加到场景图

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多