线程不应该再运行了

时间:2014-03-23 10:04:37

标签: c# unity3d

我有一个对象和附加到它的脚本。 我想在脚本的Update函数中将数据发送到Web服务器。

所以我创建了一个WWW对象。 但是一段时间后,Unity开始报告“线程不应再运行了”。

以下是更新功能:

void Update () 
    {
        //ambil tindakan dari server

        //bikin object www
        //bikin request ke localhost/vacuum?r=index/action
        //ambil hasilnya (json)

        //ambil perintah

        //eksekusi perintah

        //scan lingkungan
        var fwd = transform.TransformDirection (Vector3.forward);
        var left = transform.TransformDirection (Vector3.left);
        var right = transform.TransformDirection (Vector3.right);
        var back = transform.TransformDirection (Vector3.back);
        RaycastHit hit_fwd = new RaycastHit(), 
                   hit_left = new RaycastHit(), 
                   hit_right = new RaycastHit(), 
                   hit_back = new RaycastHit();
        bool bool_hit_fwd, bool_hit_left, bool_hit_right, bool_hit_back;
        float 
            distance_fwd = 0.0f, 
            distance_left = 0.0f, 
            distance_right = 0.0f, 
            distance_back = 0.0f;

        bool_hit_fwd = Physics.Raycast (transform.position, fwd, out hit_fwd, 50);
        bool_hit_left = Physics.Raycast (transform.position, left, out hit_left, 50);
        bool_hit_right = Physics.Raycast (transform.position, right, out hit_right, 50);
        bool_hit_back = Physics.Raycast (transform.position, back, out hit_back, 50);

        if (bool_hit_fwd) 
        {
            distance_fwd = hit_fwd.distance;
        }

        if (bool_hit_left) 
        {
            distance_left = hit_left.distance;
        }

        if (bool_hit_right) 
        {
            distance_right = hit_right.distance;
        }

        if (bool_hit_back) 
        {
            distance_back = hit_back.distance;
        }

        transform.Rotate(0, 0.01f, 0);

        print(
            "rot-y/pos-x/pos-y :: fwd/left/right/back = " + 
            transform.rotation.eulerAngles.y + '/' +
            transform.position.x + '/' +
            transform.position.y + '/' +

            " :: " +
            distance_fwd + '/' + 
            distance_left + '/' + 
            distance_right + '/' + 
            distance_back);

        String url = "http://localhost:1234/minibrain?" +
            "roty=" + transform.rotation.eulerAngles.y.ToString() + 
            "&posx=" + transform.position.x.ToString() + 
            "&posy=" + transform.position.y.ToString() + 
            "&fwddist=" + distance_fwd.ToString() + 
            "&leftdist=" + distance_left.ToString() + 
            "&rightdist=" + distance_right.ToString() + 
            "&backdist=" + distance_back.ToString();

        WWW www = new WWW(url);
    }

没有错误。 Web服务器正确接收数据。但数据传输率大大降低。像每秒100次传输一样,每秒传输10次。

有没有办法创建WWW对象而不会导致“线程不再运行”?

2 个答案:

答案 0 :(得分:1)

这里的问题很可能就是你在Update()中运行了所有内容。这通常会尽可能快地向前推进。您对WWW的调用将立即返回(它不会等到所有操作都完成),然后您转到下一帧。

因此,如果您的更新运行速度足够快,您将会遇到越来越多未完成的WWW对象。我不知道它目前的运行速度有多快,但你必须问问自己是否需要那么多的数据点,或者如果通过WWW调用是最好的方法。如果您的设置可用,套接字连接可能会更好。

如果您对以尽可能快的方式发送数据感到满意,请确保通过将调用设置为协程来检查isDone,或者在这种情况下仅为其返回产生收益。 (不要在它上面使用while循环)或者或者只是确定一个你想要数据的常规间隔,然后发送它,如果最终在你的设置上更容易。

答案 1 :(得分:1)

使用coroutines。在Update()函数中实现Web请求是一种糟糕的经历,因为Web请求需要一些时间来执行。