使用多线程(jME3)获取游戏状态

时间:2014-04-23 17:35:31

标签: java multithreading jmonkeyengine

我最近通过wiki’s tutorial尝试了Java Monkey(3)的多线程。由于我只是想测试原型clinet,我制作了一个程序,使用'Cubes'库创建一些立方体( hub.jmonkeyengine.org/wiki/doku.php/jme3:contributions:cubes ) ,然后将其序列化为一些字节数据(服务器将对播放器附近的地图块执行此操作)。目的是模仿从服务器发送的块,这将发生在一个单独的线程中,如维基上的网络教程中所述( 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;
    }
};

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

如果我错过了问题中的任何内容,我很乐意添加它!谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

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

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

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